back

2. Carica il settore di boot chiamato bootsector in una specifica locazione di memoria.

3. Bootsector (o un altro bootloader come LILO o GNU GRUB) carica setup, alcune routine per la decompressione e l'immagine del kernel compressa.

4. il kernel viene decompresso in modalità protetta.

5. Inizializzazione a basso livello viene fatta da routine in assembly.

6. Inizializzazione di alto livello in C.

Questo il boot in a nutshell, vediamo ora di fare una panoramica più approfondita se non nel firmware del BIOS, non ancora disponibile al momento su tutti i pc (il progetto OpenBIOS si prefigge di creare una versione free per il firmware del BIOS [3]), almeno su quella del codice di GNU/Linux iniziando a vedere cosa fa un bootloader.

Cos'è un bootloader?


Quando un PC (i386) si avvia, la prima cosa che il BIOS fa è quella di leggere l'istruzione che si trova all'indirizzo FFFF:0000, che corrisponde fisicamente alla memoria 0xFFFF0 (all'avvio i registri sono inizializzati a questi valori %ds=%es=%fs=%gs=%ss=0, %cs=0xFFFF0000, %eip = 0x0000FFF0). Questa locazione, che si trova vicino alla fine dell'area di memoria di sistema (per le macchine a 32 bit si intende), contiene un jump al programma di startup del BIOS che dopo aver fatto dei check (POST Power On Self Test), cerca il dispositivo di boot che contiene nel suo primo settore la "signature" di boot 0xAA55 (vedremo in seguito del codice scritto in C per creare un settore di boot).

Il bootloader è il programma che carica il kernel del nostro sistema operativo. Un bootloader normalmente è diviso in due fasi, la fase 1 e la fase 2 (in alcuni casi, come GRUB, esiste anche una fase intermedia chiamata 1.5).

Nel caso del bootloader di Linux (almeno fino alla versione 2.4) la fase 1 è quella che si occupa di caricare il codice che dovrà a sua volta caricare il kernel, mentre nel caso di altri bootloader, la fase 1 caricherà il codice del corrispettivo bootloader che ci permetterà poi di caricare il nostro kernel preferito. Questo codice si trova nel primo settore di 512 bytes e non può superare i primi 446 bytes a causa dei restanti 64 bytes che definiscono la partition table (più i 2 bytes di signature). Questo settore è comunemente conosciuto come MBR: Master Boot Record. La fase 2 di un bootloader caricherà il kernel e le routine di decompressione (naturalmente stiamo parlando del caso di un kernel Linux) fino a chiamare la nostra init che avvierà il sistema.

Anche se il kernel 2.6 ha abbandonato per ovvi motivi la prima fase del suo bootloader affidandosi a GRUB o LILO, presenterò qui una panoramica del boot concentrandomi sul bootloader di Linux, dando un occhio al primo codice e poi alla versione del kernel 2.6.

back