Próximo, tentarei responder à sua pergunta, mas para uma descrição mais abrangente do processo de inicialização, tente o artigo da IBM .
Ok, suponho que você esteja usando o GRUB ou GRUB2 como seu carregador de inicialização para obter explicações. Primeiro, quando o BIOS acessa seu disco para carregar o carregador de inicialização, ele usa suas rotinas internas para acesso ao disco, que são armazenadas na famosa interrupção de 13h. O gerenciador de inicialização (e o kernel na fase de configuração) fazem uso dessas rotinas quando acessam o disco. Observe que o BIOS é executado no modo real (16 bits) do processador, portanto, não pode endereçar mais de 2 ^ 20 bytes de RAM (2 ^ 20 e não 2 ^ 16 porque cada endereço no modo real é composto por segmento_address * 16 + deslocamento , onde o endereço do segmento e o deslocamento são de 16 bits, consulte http://en.wikipedia.org/wiki/X86_memory_segmentation ). Portanto, 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 carregador de inicialização 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 carregará 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 em um endereço fixo do sistema de arquivos. Ele não precisa entender o sistema de arquivos para fazer isso, porque o estágio 1.5 está no sistema de arquivos, é um código "bruto" e pode ser carregado diretamente na RAM e executado: http://www.pixelbeat.org/ docs / disk / . A carga do stage1.5 do disco para a RAM faz uso das rotinas de acesso ao disco do BIOS.
O Stage1.5 contém os utilitários do sistema de arquivos, para que ele possa ler o stage2 do sistema de arquivos (bem, ele ainda usa o BIOS 13h para ler do disco para a RAM, mas agora pode decifrar as informações do sistema de arquivos sobre inodes etc. e obter o código bruto do disco). Os BIOS mais antigos podem não conseguir acessar todo o HD devido a limitações no modo de endereçamento de disco - eles podem usar o sistema Cylinder-Head-Sector, incapaz de endereçar mais de 8 GiB de espaço em disco: http: //en.wikipedia. org / wiki / Setor de cabeçotes .
O Stage2 carrega o kernel na RAM (novamente, usando os utilitários de disco do BIOS). Se for 2.6+ ou mais, ele também possui o initramfs compilado, portanto, não é necessário carregá-lo. Se for um kernel mais antigo, o carregador de inicialização também carrega imagem initrd independente 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 ramdisk) pesa mais de 1 MiB; portanto, para carregá-los na RAM, você precisa carregar o kernel no primeiro 1 MiB, depois pular para o modo protegido (32 bits) e mover o kernel carregado para a memória alta (livre o primeiro 1 MiB para o modo real), depois retorne ao modo real (16 bits) novamente, instale o ramdisk do disco para o primeiro 1 MiB (se for um initrd separado e um kernel mais antigo), possivelmente mude para o modo protegido (32 bits) novamente, coloque-o onde ele pertence, possivelmente volte ao modo real (ou não: /programming/4821911/does-grub-switch-to-protected-mode ) e execute o código do kernel. Aviso: não tenho certeza absoluta sobre o rigor e a precisão desta parte da descrição.
Agora, quando você finalmente executa o kernel, já o possui e o ramdisk foi carregado na RAM pelo gerenciador de inicialização , para que o kernel possa usar os utilitários de disco do ramdisk para montar seu sistema de arquivos raiz real e fazer a rotação do root. Os drivers ramfs estão presentes no kernel, para que ele possa entender o conteúdo do initramfs, é claro.