Ok, eu suponho que você esteja usando o GRUB ou o GRUB2 como seu bootloader para explicação. Em primeiro lugar, quando a BIOS acessa seu disco para carregar o gerenciador de inicialização, ele faz uso de suas rotinas internas para acesso ao disco, que são armazenadas na famosa interrupção de 13 horas. Bootloader (e kernel na fase de instalação) fazem uso dessas rotinas quando acessam o disco. Observe que o BIOS é executado no modo real (16 bits) do processador, portanto, ele não pode endereçar mais de 2 ^ 20 bytes de RAM (2 ^ 20 não 2 ^ 16 porque cada endereço em modo real é composto por segment_address * 16 + offset , onde o endereço do segmento e o deslocamento são de 16 bits, consulte link ). Assim, essas rotinas não podem acessar mais de 1 MiB de RAM, o que é uma limitação estrita e um grande inconveniente.
O BIOS carrega o código do bootloader diretamente do MBR - os primeiros 512 bytes do seu disco e o executa. Se você estiver usando o GRUB, esse código será o estágio 1 do GRUB. Esse código carrega o estágio 1.5 do GRUB, localizado nos primeiros 32 KiB de espaço em disco, chamado região de compatibilidade do DOS ou de um endereço fixo do sistema de arquivos. Ele não precisa entender o sistema de arquivos para fazer isso, porque mesmo o estágio 1.5 está no sistema de arquivos, é um código "bruto" e pode ser carregado diretamente na RAM e executado: link . A carga do stage1.5 do disco para a RAM faz uso das rotinas de acesso ao disco da BIOS.
OStage1.5contémosutilitáriosdosistemadearquivos,paraqueelepossalerostage2dosistemadearquivos(bem,eleaindausaoBIOS13hparalerdodiscoparaaRAM,masagorapodedecifrarinformaçõesdosistemadearquivossobreinodesetc.foradodisco).BiosmaisantigospodemnãosercapazesdeacessaroHDinteirodevidoalimitaçõesnomododeendereçamentodedisco-elespodemusarosistemaCylinder-Head-Sector,incapazdeendereçarmaisdoque8GBdeespaçoemdisco:
O Stage2 carrega o kernel na RAM (novamente, usando os utilitários de disco do BIOS). Se é kernel 2.6+, também tem o initramfs compilado, portanto não há necessidade de carregá-lo. Se for um kernel antigo, o bootloader também carrega imagens initrd independentes na memória, para que o kernel possa montá-lo e obter drivers para montar o sistema de arquivos real a partir do disco.
O problema é que o kernel (e o ramdisk) pesa mais de 1 MiB, para carregá-los na RAM você tem que carregar o kernel no primeiro 1 MiB, então pular para o modo protegido (32 bits), mover o kernel carregado para alto memória (libere o primeiro 1 MiB para o modo real), retorne ao modo real (16 bits) novamente, obtenha o ramdisk do disco para o primeiro 1 MiB (se for um kernel initrd e antigo separado), possivelmente mude para protegido (32 bits) modo de novo, coloque-o onde ele pertence, possivelmente voltar ao modo real (ou não: link ) e execute o código do kernel. Aviso: Não tenho certeza absoluta sobre a exatidão e exatidão dessa parte da descrição.
Agora, quando você finalmente executa o kernel, você já o tem e o ramdisk é carregado na RAM pelo bootloader , então o kernel pode usar utilitários de disco do ramdisk para montar seu sistema de arquivos raiz e pivot root isto. Os drivers ramfs estão presentes no kernel, então ele pode entender o conteúdo do initramfs, é claro.