03 - BIOS (Basic Input-Output System)
video: https://youtu.be/... no frontmatter da nota.1. A Herança do IBM PC e o Paradigma do Modo Real
O BIOS (Basic Input/Output System) é o firmware padrão original que definiu a arquitetura IBM PC compatível desde o início da década de 1980. Diferente de um firmware moderno, o BIOS não é apenas um inicializador de hardware; ele foi projetado para atuar como uma camada de abstração (uma API rudimentar) entre o hardware físico e o software de sistema operacional primitivo (como o MS-DOS).
A característica arquitetural mais definidora e restritiva do BIOS é a sua submissão estrita ao Modo Real (Real Mode) da arquitetura x86. Quando a CPU opera neste modo, ela emula o comportamento de um processador Intel 8086 clássico de 16 bits. Isso impõe barreiras fundamentais:
-
Limite de Endereçamento: O barramento de endereços é limitado a 20 pinos lógicos, resultando em um espaço de endereçamento máximo absoluto de 1 Megabyte ($2^{20}$ bytes). O BIOS não consegue enxergar, nativamente, nenhum byte de memória RAM instalado além desse limite de 1MB.
-
Modelo Segmento:Offset: Como os registradores da CPU em 16 bits só conseguem apontar para 64KB por vez, o BIOS utiliza o complexo cálculo de endereço físico baseado na fórmula
(Segmento * 16) + Offset. -
Ausência de Proteção: Não existe proteção de memória, anéis de privilégio (Ring 0 a Ring 3) ou memória virtual. Qualquer código em execução sob a tutela do BIOS tem acesso direto e irrestrito ao hardware e pode sobrescrever estruturas críticas do sistema.
Devido a essas restrições, sistemas operacionais modernos como o Linux abandonam completamente o BIOS assim que assumem o controle, comutando a CPU para o Modo Protegido (32 bits) ou Modo Longo (64 bits) e substituindo as rotinas do BIOS por seus próprios Device Drivers nativos.
2. A Tabela de Vetores de Interrupção (IVT) e a API do BIOS
Para fornecer serviços de I/O básicos sem que o programador precisasse conhecer os endereços de hardware específicos de cada placa-mãe, o BIOS povoa o primeiro Kilobyte exato da memória RAM (do endereço 0x00000 ao 0x003FF) com a IVT (Interrupt Vector Table).
A IVT é uma matriz que contém 256 ponteiros (vetores) de 4 bytes. Cada vetor aponta para uma rotina de serviço localizada dentro do chip de memória ROM do BIOS. O software invoca esses serviços disparando interrupções de software na CPU (instrução INT em linguagem Assembly).
As chamadas mais críticas para o ecossistema de boot incluem:
-
INT 10h(Serviços de Vídeo): Usada pelos bootloaders (como o GRUB legacy) para limpar a tela, desenhar caracteres e menus na tela antes que os drivers gráficos complexos do Linux (KMS/DRM) sejam carregados. -
INT 13h(Serviços de Disco): A espinha dorsal do carregamento do sistema operaciona. Permite ler e gravar setores raw (brutos) no disco rígido ou disquete. -
INT 16h(Serviços de Teclado): Lê o buffer do controlador de teclado (chip 8042) para capturar pressionamentos de teclas (ex: setas para selecionar o kernel no GRUB). -
INT 15h(Serviços de Sistema): Amplamente usada por bootloaders mais avançados para consultar o mapa físico da memória RAM (INT 15h, AX=E820h), permitindo que o Linux saiba exatamente quais áreas de memória estão livres e quais estão reservadas para hardware.
3. O Mapa de Memória UMA e Option ROMs
Dentro do claustrofóbico limite de 1MB do Modo Real, o BIOS impõe um loteamento estrito conhecido como mapa de memória PC compatível. Os primeiros 640KB formam a Memória Convencional, onde os bootloaders e programas residem. Os 384KB restantes (de 640KB até 1MB) formam a UMA (Upper Memory Area).
A UMA é estrategicamente mapeada para uso de periféricos através de Option ROMs. Quando o BIOS não sabe como operar um hardware complexo (como uma placa de rede moderna ou uma controladora RAID), ele varre o espaço de memória UMA (geralmente entre 0xC0000 e 0xEFFFF).
Ao encontrar a assinatura mágica 0x55AA nesses endereços, o BIOS identifica que um periférico injetou seu próprio mini-firmware (Option ROM) ali.
-
VBIOS (Video BIOS): A placa de vídeo expande os serviços do BIOS (melhorando a
INT 10h) injetando seu código na UMA. -
PXE (Preboot eXecution Environment): Placas de rede injetam código de boot via rede para permitir que o BIOS faça o download do kernel Linux através de um servidor TFTP, burlando a necessidade de um disco local.
4. O Sistema de Endereçamento CHS vs LBA
Historicamente, os serviços de disco do BIOS (INT 13h) foram concebidos quando os discos rígidos eram primitivos. A leitura dependia da geometria física exata do disco, utilizando a trinca CHS (Cylinder, Head, Sector - Cilindro, Cabeça, Setor).
Conforme os discos cresceram, os limites dos registradores alocados para o CHS foram estourados (resultando na clássica barreira dos 504 MB, e depois 8.4 GB). Para corrigir isso, o BIOS foi atualizado com as INT 13h Extensions, abandonando a geometria física em favor do LBA (Logical Block Addressing).
Com o LBA, o disco é tratado como um array linear de blocos sequenciais (de 0 até $N$). As extensões LBA do BIOS utilizam endereços de 64 bits para blocos lógicos. Contudo, devido à dependência histórica de setores de 512 bytes e tabelas de partição MBR, o ecossistema BIOS esbarra em um limite prático implacável de 2.2 Terabytes para discos de boot, forçando o mercado a acelerar a adoção da UEFI e das tabelas GPT.
5. O Bootstrap Loader (INT 19h) e a Injeção do MBR
Ao final de todos os testes de POST e inventário, o BIOS não sabe ler sistemas de arquivos complexos como ext4, xfs ou btrfs. Sua compreensão de armazenamento é baseada unicamente em blocos brutos. O processo de "dar o boot" sob a ótica do BIOS é um processo mecânico de delegação de controle, orquestrado pela interrupção INT 19h (Bootstrap Loader).
A sequência exata de eventos lógicos e físicos é a seguinte:
-
O BIOS consulta o CMOS/NVRAM para verificar a ordem de prioridade de boot (Boot Order).
-
Ele emite um comando LBA 0 (ou CHS 0,0,1 no formato legado) via
INT 13hpara o primeiro disco rígido da fila. -
O disco retorna os exatos primeiros 512 bytes armazenados em sua mídia magnética ou chips NAND.
-
O BIOS armazena esse bloco de dados no endereço de memória física
0x00007C00. -
O BIOS realiza uma validação de segurança mínima: ele lê os dois últimos bytes deste bloco (offsets 510 e 511). Se esses bytes formarem a assinatura mágica de disco inicializável —
0x55 0xAA—, o BIOS conclui que encontrou um código válido. -
O BIOS executa uma instrução de salto (
JMP 0x0000:0x7C00), transferindo o ponteiro de instrução da CPU (IP) para o primeiro byte do código recém-carregado.
Este código de 512 bytes é o MBR (Master Boot Record). A partir do microssegundo em que o salto é executado na memória 0x7C00, a responsabilidade do BIOS termina. O computador não está mais sob o controle do fabricante da placa-mãe, mas sim sob o controle do Estágio 1 do bootloader (como o GRUB), que terá a dura missão de escalar o ambiente de 16 bits do BIOS para conseguir ler o kernel Linux real localizado na partição de sistema.