Skip to content

Inicialização da máquina

Rafael Medeiros edited this page Apr 5, 2020 · 9 revisions

Nesse tópico vamos falar sobre Inicialização da maquina

Na imagem a cima você tem um gráfico explicando.

Em um sistema multicore é escolhido uma CPU para ser o BSP(Bootstrap Processor) os demais são definidos de AP (Application Processor) é mantido esse estado parado até que o kernel seja carregado.
o interessante que mesmo com a evolução dos processadores eles tem a mesma característica do Intel 8086 - 1978 original.

Todos os registro do CPU são bem definidos após a inicialização incluindo o EIP(Instruction Pointer) que contém a memória de instrução. A intel tem um hack embora que apenas 1MB possa ser endereçado na inicialização, um endereço oculto( deslocamento ) é aplicado ao EIP para que o primeiro endereço seja 0xFFFFFFF0 (16 bytes antes do final de 4 GB de memória e bem acima de um megabyte), esse endereço é chamado vetor de redefinição.

A placa-mãe garante que a instrução no vetor de redefinição seja um salto para o local da memória mapeada para o ponto de entrada do BIOS. Esse salto limpa o endereço base oculto presente na inicialização, isso tudo graças o mapeamento de memória do chipset. Exemplo das regiões da memória:




Após inicialização do chipset o processador começa a executar as instruções da BIOS e inicializa o POST( Power-on Self Test ) executando os seguintes testes:

  1. Inicia o teste da placa de vídeo, caso haja falha sinaliza com um beep caso contrário renderiza a Logo do fabricante.
  2. Inicia a verificação de memória caso haja falha novamente é sinalizado com um beep

O POST é um tipo de checklist de verificação do computador se todos os componentes estão ok.

Após finalizar o POST a BIOS começa a corrida para iniciar o Sistema Operacional, procurando a instrução de inicialização do boot, se não houver um boot de inicialização a BIOS irá disparar uma reclamação de "Non-System Disk or Disk Error." o BIOS agora lê o primeiro setor de 512 bytes (setor zero) do disco rígido que é chamado Master Boot Register(MBR). Existem 2 componentes no MBR:

  1. Um pequeno programa de inicialização do Sistema Operacional.
  2. Tabela de partição.

O BIOS não se preocupa com nenhum desses itens acima, simplesmente carrega o MBR no local de memória 0x7c00 Figura representando o desenho do 512 bytes

O MBR pode ser um carregador MBR windows, carregadores Linux(LILO/GRUB) ou até mesmo um virus. A tabela de partição é muito bem definida em uma aréa de 64 bytes com 4 entrada de 16 bytes como é dividido o HD(para que você possa ter vários sistemas operacionais e volumes separados). Tradicionalmente o MBR da Microsoft examina a tabela de partição, encontra a única partição marcada como ativa, carrega o setor de inicialização para essa partição e executa o código, o setor de inicialização é o primeiro setor da partição, em opocisão ao primeiro setor de todo o disco, caso algo de errado você receberá uma mensagem de "Sistema Operacional ausente" so para deixar claro essa mensagem não vem da BIO e sim do MBR, então cada carregador MBR tem sua tipo de mensagem.

O carregamento de inicicialização ficou mais sofesticado e mais flexível.

Carregadores de inicialização do Linux LILO e GRUBP podem lidar com grandes variedades de sistema operacionais e configurações de inicialização. Código de inicialização deles não seguem o padrão de partição ativa, O processo funciona sim:

O próprio MBR contém o primeiro estágio do carregador de inicialização. O GRUB chama esse estágio 1. Devido ao seu tamanho reduzido o código no MBR faz o suficiente para carregar outro setor do disco que contém código boostrap adicional. Esse setor pode ser o setor de inicialização de uma partição, mas também pode ser um setor codificado no código MBR quando o MBR foi instalado. O código MBR mais o código carregado na etapa 2 lê um arquivo que contém o segundo estágio do carregador de inicialização. No GRUB, esse é o GRUB Stage 2.O código do estágio 2 lê um arquivo de configuração de inicialização grub.conf. Em seguida, apresenta as opções de inicialização para o usuário ou simplesmente segue em frente em um sistema de inicialização única. Nesse ponto, o código do carregador de inicialização precisa iniciar um kernel. Ele deve conhecer o suficiente sobre sistemas de arquivos para ler o kernel da partição de inicialização. isso significa ler um arquivo como "vmlinuz-xxxxxxx" contendo o kernel, carregando o arquivo na memória e pulando para o código de inicialização do kernel.

A uma complicação que precisa ser relatada a imagem do kernel do linux mesmo compactado não se encaixa nos 640K de memoria RAM, só para ter noção o ubuntu tem mínimo de 1.7MB mas o carregador de inicialização deve chamar deve chamar no modo real para executar as rotinas da BIOS para leitura no disco. Para isso existe uma técnica para que o boot alterne entre o modo real e o protegido para acessar a memória acima de 1MB, você pode conferir isso no código fonte do GRUB (procure no stage2/ as chamadas para real_to_prot e prot_to_real). Final o carregador consegue colocar o Kernal ma memória Mas deixa o processador em modo real no final.

Clone this wiki locally