domingo, 8 de janeiro de 2012



0-1 ou On/OFF

Desde que comecei esta "brincadeira" de escrever sobre sistemas operacionais — bem, uma brincadeira que está ficando cada vez mais séria — tenho recebido emails, mensagens da rede social me estimulando e perguntando algumas particularidades dos sistemas. Para mim, tem sido um desafio de atualização e mesmo de aprendizado pois os novos processadores estão há anos-luz daquele velho código do 8086 que aprendi na escola de engenharia.

O assunto, desta vez, é o on/off, para responder à uma pergunta que os alunos de sistemas fazem frequentemente: como o sistema operacional é carregado na memória do computador? Em que exato momento isto acontece e o que acontece em seguida? Este assunto também é uma continuidade do último artigo (Anatomia de um kernell).



Bem, primeiro, é preciso explicar que quando a corrente elétrica começa a percorrer os circuitos da placa-mãe e chega ao processador este se encontra no que chamamos de "real mode" (em contraposição ao "protected mode"). Neste estado, o processador tem acesso a 1MB de memória ROM e começa executando o código que se encontra no endereço final deste segmento ou 0xFFF0 (absoluto CS:IP F000:FFF0). Este código é o que chamamos de Sistema Básico de Entrada e Saída ou Basic Input Output System (BIOS).

Usando uma descrição simplista e resumida, este programa (BIOS) executa, então o self-test ou Power-On Self Test (POST) que verifica a integridade física do sistema e dos periféricos. Em seguida, o programa procura pela palavra 0xAA55 (assinatura de boot) no primeiro setor de um periférico do tipo disco (Floppy, HD, CD/DVD etc.) ou cartão de memória (pen drive, cartão SD etc.).

Clicando nesta imagens podes ver um exemplo do POST


Uma vez encontrado o setor de boot, normalmente chamado de Master Boot Record (MBR) o sistema carrega o código para o endereço 0x7C00 do segmento inicial da memória (CS:IP 0000:7C00) e passa a executar as instruções a partir daí.

Bem, a partir daí o kernel do sistema operacional é carregado na memória. No caso do Linux, o código binário do kernel é carregado em 0x07C0 (em modo real 0000:7C00 = 0x07C0 shifted left once + 0). O código Assembly do Loader pode ser encontrado em /usr/src/linux/arch/x86/boot/header.S (linux=linux-source-X.X.X para cada versão de kernel). O código do header.S substitui os antigos códigos do kernel bootsect.S/setup.S.

Master Boot Record [1]


O passo seguinte é a descompressão do kernel (zImage ou vmlinuz). O arquivo zImage (vmlinuz) não é apenas uma imagem comprimida mas tem o próprio gzip no início do arquivo (não se pode descomprimir o arquivo vmlinuz). Durante este processo, qualquer erro trava tudo pois o sistema não está operativo e a BIOS não tem o controle. Finalmente, a função start_kernel() que é descrita no arquivo /usr/src/linux/init/main.c entra em ação e nunca retorna. A partir deste ponto, todo o SO codificado em C entra em operação.

Hello World!

Referências:

[1] Fonte da imagem: Voronin, A. Data storage on hard discs (Part 1) May 22, 2001, http://www.engineersgarage.com/mygarage/how-computer-boots-up

Um comentário:

  1. Sugestão de um aluno para ler sobre o problema da linha A20: http://www.win.tue.nl/~aeb/linux/kbd/A20.html. O tratamento do problema é feito pelo arquivo a20.c no /usr/src/linux/arch/x86/boot. Boa leitura.

    ResponderExcluir