Melhor resposta
Depende do que você entende por sistema operacional. Certa vez, escrevi um sistema de enfileiramento simples que executaria várias sessões de protocolo de maneira round-robin. Mas funcionou em um sistema operacional padrão. Quando os microcontroladores foram lançados para sistemas embarcados, os engenheiros normalmente escreviam seus próprios sistemas operacionais rudimentares, conforme indicado em uma das outras respostas.
O menor sistema operacional útil que usei que tinha os recursos básicos de uma operação multitarefa -o sistema de prateleira foi denominado QNX. Era um sistema Unix reduzido e rodava no primeiro IBM PC. Não tinha gráficos extravagantes, mas eu poderia fazer desenvolvimento de software confortavelmente nele. Na verdade, a única diferença real para uma máquina moderna era a interface do usuário com cores e gráficos. Então, basicamente, a introdução do DOS pela IBM fez a indústria de computadores retroceder pelo menos 10 anos. Havia vários sistemas operacionais superiores (que poderiam ter sido adaptados) ou em desenvolvimento na época, é claro, o Unix definindo o padrão.
Resposta
Acabei de terminar o desenvolvimento um kernel para uma aula ( CS-4284 Systems & Networking Capstone ) durante meu último semestre na escola. Anteriormente, eu fiz um curso de SO que visa trabalhar com o SO da perspectiva do programador, e não da perspectiva de um designer de SO. Estar envolvido no desenvolvimento de SO e kernel pelo último ano e meio (não é muito tempo, mas “aprendi muito), eis o que recomendo:
1. Mestre C não posso mais enfatizar isso. Não, realmente, domine. O desenvolvimento do sistema operacional é difícil. Inclui muitos conceitos de que você realmente precisa para dominar o C, portanto, não o atrapalha. Por exemplo, pegue o canal Unix (digitado | em um shell). Para desenvolver um canal em seu SO, você precisa entender muito bem o sistema de arquivos do SO e a estrutura de arquivos. É um problema típico de buffer limitado (consumidor / produtor) e terá que lidar com toda a sincronização. Você precisa estar ciente da memória virtual ao escrevê-la. Além disso, o Unix é tipicamente BYOB (traga seu próprio buffer). precisará gerenciar adequadamente o buffer que o usuário forneceu, etc … A última coisa que você gostaria de fazer aqui é lidar com questões básicas de C, como ponteiros e gerenciamento de memória (observação: o gerenciamento de memória no sistema operacional é 10 vezes mais difícil do que o gerenciamento de memória C: você precisa estar ciente dos espaços de endereço do usuário versus kernel)
2. Kernel vs. OS Você precisa entender a diferença entre um kernel e um sistema operacional. Um kernel é essencialmente o cérebro do SO. O SO é um conjunto de aplicativos agrupados. Por exemplo, o Mac OS X inclui: um kernel, a interface (GUI), aplicativos padrão integrados (Finder – que é apenas uma abstração para visualize o sistema de arquivos, TextEdit, um shell etc …)
3. Não mergulhe direto É impossível começar fazendo o desenvolvimento do kernel em questão de dias ou semanas. Eu sugiro que você comece com o seguinte:
- Familiarize-se com as etapas de compilações GCC (o que acontece quando você executa o gcc, como um executável é produzido e o que acontece quando você executa o programa). Você também pode escrever um assembler simples em C (tomar o código assembly como código de máquina de entrada e saída. Isso requer que você entenda quais seções .data, .text e .bss estão em assembly (muito útil para baixo o caminho para entender a memória virtual do sistema operacional). Você também entenderá o endereçamento no nível da máquina e como os desvios são resolvidos.
- Familiarize-se com o mach ferramentas e programas de nível interno. Eu sugiro fazer o laboratório de bombas, porque existem muitos materiais educacionais por aí. Apenas o laboratório de bombas do Google.
- Familiarize-se com os ataques básicos do sistema operacional. Eu sugiro olhar para o estouro de buffer pelo mesmo motivo do ponto 1 (laboratório de estouro de buffer do google).
- Aprenda sobre chamadas de sistema, threads e processos em C. A partir daí, desenvolva seu próprio shell em C.
- Aprenda sobre alocação de memória e implemente malloc e free em C. Aprenda sobre as compensações de design, estratégias de alocação, estratégias de liberação, etc …
- Aprenda sobre multi-threading e multi-processamento em C. A partir daí, mergulhe nos mecanismos de sincronização (bloqueios, mutexes, semáforos) e desenvolva um pool de threads em C, que outros programas possam usar.
4. Agora, você pode começar o desenvolvimento de kernel do SO real, mas simplificado. Neste ponto, você pode começar a desenvolver em um SO real como um designer de SO. Google Stanford Pintos e você terão acesso a um pequeno kernel educacional desenvolvido em Stanford. Acompanha documentação e um conjunto de 4 projetos. Você pode pesquisar no Google algumas escolas que têm slides de palestras para Pintos. Sugiro comprar Conceitos de sistema operacional ( Amazon.com: Conceitos de sistema operacional (9781118063330): Abraham Silberschatz, Peter B.Galvin, Greg Gagne: Livros ). A documentação é muito boa e os projetos são bem explicados. O sistema operacional também vem com testes que você pode executar executando `make check`, para que você possa ver se fez as coisas corretamente ou não.
5. Você pode começar a contribuir para o Linux Será necessário muito esforço examinar o código-fonte e as decisões de design do Linux (que são muito mais complicadas do que as do Pintos), mas acho que neste ponto, você vai poderá pelo menos começar. Com mais prática e leitura, você será capaz de pegá-lo.
Acabei de concluir a etapa 4. Adorei as etapas 1 a 3, mas, francamente, na metade da 4, percebi que não estou MUITO interessado no desenvolvimento de sistema operacional. Eu gostava muito de trabalhar com o sistema operacional como um programador (da perspectiva do programador), mas não gostava de me aprofundar tanto. Eu aprendi muito com o desenvolvimento do kernel, e ele expõe você a muitas coisas. Além disso, se você pode escrever um kernel, você escreve qualquer pedaço de software que existe. Eu recomendo fortemente que você execute pelo menos as 3 primeiras etapas, pois isso fornece uma ótima visão do sistema operacional. Você literalmente se tornará um melhor engenheiro de software em geral. Você aprenderá a apreciar mais as linguagens de alto nível e também a usar a ferramenta / linguagem / tecnologia certa para o trabalho certo.
Eu tenho muito material sobre desenvolvimento de SO, projetos, testes, etc … Se as pessoas estiverem interessadas, deixe-me saber comentando e talvez eu possa montar um eBook / tutorial / guia online com um ambiente de teste que guiará iniciantes no desenvolvimento de SO e forneça projetos e feedback para trabalhar.