1 pontos por GN⁺ 2024-07-16 | 1 comentários | Compartilhar no WhatsApp
  • As pessoas distinguem entre o que é complexo e o que é apenas complicado. A complexidade é vista como algo interessante, mas a complicação é vista como algo prejudicial. O processo de configuração de uma CPU x86_64 é, em grande parte, complicado.
  • Explica como configurar a CPU, a partir de um setor de boot carregado pelo BIOS, para sair do modo real de 16 bits e entrar no modo longo de 64 bits. Essa configuração é básica, e ainda há mais trabalho a ser feito.
  • São necessários o manual Intel 64 and IA-32 Architectures Software Developer’s Manual, um montador (usando nasm) e o QEMU. É preciso conhecer assembly x86 e a sintaxe do nasm.

Ponto de partida: BIOS

  • Após o reset, a CPU x86 está em "modo real". Esse modo usa tamanho básico de operando de 16 bits. Com segmentação, é possível endereçar 1 MB de memória.
  • Depois do BIOS, o primeiro código executado está no setor de boot. O BIOS procura o primeiro setor do sistema que termina com 0xaa55 e carrega esse setor de boot no endereço de memória 0x7c00.
  • O BIOS fornece 512 bytes, e é com isso que o restante do bootloader precisa ser inicializado.

Configurando o setor de boot

  • Monte um setor de boot simples que use rotinas do BIOS para exibir uma mensagem na tela e então pare. Isso permite verificar se as ferramentas estão funcionando.
  • O setor de boot é configurado com código assembly e um Makefile.

Etapa 1 – carregar a etapa 2 do disco

  • O bootloader pode ser dividido em duas etapas. A etapa 1 é o código do setor de boot, ou seja, tudo o que o BIOS carrega. O único propósito da etapa 1 é carregar a etapa 2 na memória.
  • Na etapa 2, faz-se a transição do modo real de 16 bits para o modo protegido de 32 bits. No modo protegido, não é possível usar rotinas do BIOS. Carregar setores do disco se torna muito mais complexo.
  • Explica como acessar o disco usando o BIOS.

Modo protegido de 32 bits

  • Faz a CPU passar do modo real (16 bits) para o modo protegido (32 bits). No modo protegido, a segmentação é usada para implementar proteção de memória.
  • Antes de mudar para o modo protegido, é preciso definir a Global Descriptor Table (GDT). A GDT é definida na memória como uma estrutura contínua.
  • Explica como definir a GDT e como mudar para o modo protegido.

Modo longo de 64 bits

  • Antes de entrar no modo longo, a CPU precisa estar em modo protegido e a paginação precisa estar habilitada. O modo protegido já foi configurado, mas a paginação ainda é necessária.
  • A paginação substitui a segmentação para gerenciar espaço de endereçamento virtual, permissões etc. Explica como criar tabelas de páginas para a transição ao modo longo.
  • Explica como definir a GDT para o modo longo e como fazer a transição do modo protegido para o modo longo.

Resumo do GN⁺

  • Este artigo explica em detalhes o processo de configurar uma CPU x86_64 para sair do modo real de 16 bits e entrar no modo longo de 64 bits. Isso ajuda a aprofundar o entendimento sobre bootloaders e desenvolvimento de kernel de sistemas operacionais.
  • Aborda vários conceitos, como BIOS, setor de boot, modo protegido e modo longo, e fornece o código assembly e os métodos de configuração necessários para cada etapa.
  • Este artigo é útil para quem tem interesse em desenvolvimento de sistemas operacionais e, em especial, oferece uma compreensão mais profunda da arquitetura x86. Um projeto com funcionalidade semelhante é "Writing a Simple Operating System – from Scratch".

1 comentários

 
GN⁺ 2024-07-16
Comentários no Hacker News
  • Existe uma forma de mudar para o modo longo sem alternar manualmente para o modo protegido
    • Foi criado um bootloader que carrega um pequeno kernel de 64 bits no setor de boot
    • Inclui o processo de carregar o kernel do disco e configurar o modo VESA
  • O 80286 tinha o MSW, um registrador de 16 bits, e o 80386 o expandiu para o CR0 de 32 bits
    • O modo longo de 64 bits adicionou o MSR EFER e expandiu o CR0 para 64 bits
    • Atualmente, apenas 11 bits do CR0 e 8 bits do EFER estão em uso
    • Fica a dúvida de por que Intel/AMD não usaram os bits livres dos registradores já existentes
  • A parte mais desnecessariamente complexa deste texto é o Makefile e o script do linker
    • O NASM pode gerar saída binária plana, mas aparentemente isso é considerado "hacky" demais
  • Todas as etapas necessárias para colocar a CPU no modo correto são desnecessariamente complexas
    • Tudo isso parece ser necessário por causa da compatibilidade retroativa
    • A Intel poderia ter fornecido um sinalizador ou instrução para iniciar diretamente no modo correto desde o começo
    • Ou poderia ter removido toda a compatibilidade retroativa
    • Lembro de já ter pesquisado se o ARM64 tem um problema parecido
    • Fico curioso se existe alguma CPU projetada em 64 bits desde o início
    • Esse provavelmente era o objetivo/projeto do Itanium
  • Pode haver defensores do UEFI que não entendem por que foi criada uma nova abordagem de bootloader
    • Como o autor diz: "se você chegou até aqui, já é algo bem legal"
  • Fico curioso sobre há quanto tempo o UEFI existe
    • É uma pena que o BIOS não tenha sido aposentado junto com o modo longo
  • Fico curioso se esse procedimento de boot é compatível com EFI/UEFI
    • Também fico curioso se o supervisor UEFI emula modo real/modo protegido/modo longo no hardware de verdade
  • Fico curioso se esse processo é mais simples no ARM