Introdução
Desenvolvimento de sistemas operacionais é a prática de escrever o software que roda antes de qualquer aplicação: o código que assume o controle a partir do bootloader, inicializa o processador, gerencia a memória e fornece o ambiente em que todo outro programa é executado. Esta wiki documenta essa prática do zero, cobrindo a construção de um kernel em vez do uso de um já existente.
O material pressupõe familiaridade com C e capacidade de ler assembly x86, sem exigir experiência prévia escrevendo código em nível de kernel. Tópicos como paginação e tratamento de interrupções são cobertos a partir dos princípios básicos. O progresso costuma ser lento: um kernel hobby capaz de chegar a um shell é, geralmente, meses de trabalho, não um projeto curto.
Organização
Seção intitulada “Organização”Os artigos estão agrupados, em linhas gerais, na ordem em que um kernel novo costuma precisar deles. Ambiente e Ferramentas cobre a construção de um cross-compiler e a configuração de um emulador antes de qualquer código de kernel ser escrito. Boot cobre a sequência entre o power-on e a primeira instrução do kernel. Fundamentos de Arquitetura, Gerenciamento de Memória e Interrupções e Exceções cobrem mecanismos x86 necessários logo no início da maioria dos kernels. Processos e Escalonamento, Drivers e Sistemas de Arquivos costumam ser relevantes assim que um kernel consegue inicializar e produzir alguma saída.
A maioria dos exemplos tem como alvo x86-64 em long mode e é compilada com um cross-compiler GCC; os artigos indicam explicitamente quando o conteúdo é específico de 32 bits ou de outra arquitetura.
Ambiente de desenvolvimento
Seção intitulada “Ambiente de desenvolvimento”Espera-se que o desenvolvimento ocorra contra um emulador como QEMU ou Bochs antes de qualquer teste em hardware físico. Emuladores reiniciam rapidamente, permitem anexar um depurador a um kernel em execução e fornecem saída de diagnóstico indisponível em firmware real quando um kernel falha logo no início. Testar em hardware físico continua sendo útil mais adiante no desenvolvimento, uma vez que a funcionalidade básica já esteja estabelecida.