Nighpher, proverò a rispondere alla tua domanda, ma per una descrizione più completa del processo di avvio, prova l' articolo IBM .
Ok, presumo che tu stia usando GRUB o GRUB2 come bootloader per spiegazioni. Prima di tutto, quando il BIOS accede al tuo disco per caricare il bootloader, utilizza le sue routine integrate per l'accesso al disco, che sono archiviate nel famoso interrupt 13h. Bootloader (e kernel in fase di installazione) utilizzano queste routine quando accedono al disco. Si noti che il BIOS funziona in modalità real (16 bit) in modalità processore, quindi non può indirizzare più di 2 ^ 20 byte di RAM (2 ^ 20 non 2 ^ 16 perché ogni indirizzo in modalità reale comprende segment_address * 16 + offset , dove sia l'indirizzo del segmento che l'offset sono a 16 bit, consultare http://en.wikipedia.org/wiki/X86_memory_segmentation ). Pertanto, queste routine non possono accedere a più di 1 MiB di RAM, il che costituisce una limitazione rigorosa e un grave inconveniente.
Il BIOS carica il codice del bootloader direttamente dall'MBR: i primi 512 byte del disco e lo esegue. Se stai usando GRUB, quel codice è GRUB fase 1. Quel codice carica GRUB fase 1.5, che si trova nei primi 32 KiB di spazio su disco, chiamato regione di compatibilità DOS o da un indirizzo fisso del file system. Non ha bisogno di capire il file system per farlo, perché anche lo stadio 1.5 è nel file system, è un codice "raw" e può essere caricato direttamente nella RAM ed eseguito: http://www.pixelbeat.org/ docs / disk / . Il caricamento di stage1.5 dal disco alla RAM utilizza le routine di accesso al disco del BIOS.
Stage1.5 contiene le utilità del filesystem, in modo che possa leggere stage2 dal filesystem (beh, usa ancora BIOS 13h per leggere da disco a RAM, ma ora può decifrare le informazioni del filesystem sugli inode ecc. E ottenere il codice raw dal disco). I BIOS più vecchi potrebbero non essere in grado di accedere a tutto l'HD a causa delle limitazioni nella loro modalità di indirizzamento del disco: potrebbero utilizzare il sistema Cylinder-Head-Sector, incapace di occupare più dei primi 8 GiB di spazio su disco: http: //en.wikipedia. org / wiki / settore testa-cilindro .
Stage2 carica il kernel nella RAM (di nuovo, usando le utilità del disco BIOS). Se è un kernel 2.6+, ha anche initramfs compilato all'interno, quindi non è necessario caricarlo. Se è un kernel più vecchio, bootloader carica anche l'immagine initrd autonoma in memoria, in modo che il kernel possa montarla e ottenere i driver per il montaggio del file system reale dal disco.
Il problema è che il kernel (e il ramdisk) pesano più di 1 MiB, quindi per caricarli nella RAM devi caricare il kernel nel primo 1 MiB, quindi passare alla modalità protetta (32 bit), spostare il kernel caricato in memoria alta (libero il primo 1 MiB per la modalità reale), quindi tornare nuovamente alla modalità reale (16 bit), ottenere ramdisk dal disco al primo 1 MiB (se si tratta di un initrd separato e di un kernel precedente), possibilmente passare nuovamente alla modalità protetta (32 bit), mettilo dove appartiene, eventualmente torna alla modalità reale (o no: /programming/4821911/does-grub-switch-to-protected-mode ) ed esegui il codice del kernel. Avvertenza: non sono del tutto sicuro della completezza e accuratezza di questa parte della descrizione.
Ora, quando finalmente esegui il kernel, lo hai già caricato e ramdisk caricato nella RAM dal bootloader , quindi il kernel può usare le utilità del disco da ramdisk per montare il tuo vero file system root e pivot root su di esso. I driver ramfs sono presenti nel kernel, quindi può comprendere il contenuto di initramfs, ovviamente.