Sto cercando di capire il processo di avvio di una macchina nel suo insieme dal momento in cui hai premuto il pulsante di accensione. C'è questo pezzo unico dal bootloader allo stadio initramfs che non capisco bene tra alcuni bit più piccoli.
Data questa configurazione di Grub per una voce, tratta da una recente installazione predefinita di Ubuntu:
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo 'Loading Linux x.y.z ...'
linux /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset
echo 'Loading initial ramdisk ...'
initrd /initrd.img-x.y.z
Cosa fa effettivamente ciò in termini di stato del sistema e memoria? Capisco che il compito di Grub è "caricare ed eseguire il kernel" e ha un proprio set di moduli per accedere ai file su dispositivi (o rete) per raggiungerli. Nell'esempio qui insmod
s, set root
e search
- ma questo è solo dal punto di vista di Grub, e non condiviso con il kernel, giusto?
Sto anche immaginando che Grub stia caricando (una copia?) Del kernel in memoria ( linux
comando ) e stia dando dei calci per iniziare l'esecuzione. (due passaggi diversi apparentemente - quindi, come?) I parametri dati possono essere letti nel kernel e interpretati (è una grande stringa mappata in memoria da qualche parte?) e forniscono le opzioni per organizzare le cose richieste.
Vedo anche questa initrd
opzione. Questo punta al mio initramfs compresso con gzip, necessario per avviare il dispositivo root effettivo specificato da root=
. Ma come viene fornito questo initramfs al kernel? Non viene passato alcun indirizzo di memoria a dove può caricarlo, né è in grado di accedervi da solo, poiché è già caricato prima dell'avvio del kernel. Alcuni documenti del kernel dicono che questo "file system" di initramfs è accessibile /dev/ram0
, ma non vedo come diventi un file di dispositivo accessibile per cominciare. Sta succedendo qualcosa sott'acqua che non vedo, immagino.
Inoltre non vedo come questo si collega ad altri caricatori di avvio, comprese le piattaforme integrate, ad esempio usando U-boot / Coreboot. Sta facendo la stessa cosa di Grub (stessi indirizzi di memoria standard?) E in che misura questi si confrontano con Grub per quanto riguarda il caricamento del kernel / initrd?
Solo per essere chiari sulle mie domande, penso di capire perché esistono le diverse fasi di avvio e quali transizioni avvengono, ma non vedo come avvengano e quali siano le esatte responsabilità per ciascuna fase. Ho la sensazione che mi sto perdendo qualche "standard" a cui tutto si riduce.
Gradirei qualche spiegazione al riguardo.
boot
la CPU salterà all'indirizzo del kernel caricato (avvia l'esecuzione). Per una voce di menu questo è implicitamente definito. vedi questo .
boot
comando implicito alla fine della sequenza. Non sono sicuro di cosa faccia esattamente in Grub, ma se usi la riga di comando di Grub per inserire questi comandi manualmente, deviboot
o rimarrà per sempregrub>
(o almeno, finché non ti annoi e spegni il computer ). I comandi precedenti "semplicemente" hanno creato un ambiente.