I bootloader di Linux
I bootloader per Linux più conosciuti sono sicuramente LILO e GRUB. Come vedremo in seguito il protocollo di boot di Linux ha un identificativo che il bootloader deve passare in fase di setup del kernel.
Ecco qui una lista di bootloader capaci di avviare Linux [4]:
0 LILO
1 Loadlin
2 bootsect-loader
3 SYSLINUX
4 EtherBoot
5 ELILO
7 GRUB
8 U-BOOT
9 Xen
Presumibilmente (e immancabilmente) ce n'è uno, o meglio c'era fino alla versione 2.4 del kernel, bootsect-loader (credo), che è proprio quello di Linux stesso. Questo articolo mostra parte del codice del bootloader di Linux con qualche accenno storico alla versione 0.0.1 di Linux che servirà per introdurre poi il codice del kernel 2.6.
Uno sguardo storico al primo codice
Permettetemi questa parafrasi: "All'inizio fu boot.s". boot.s contiene il codice per il bootloader che avvierà il sistema e si preoccuperà di caricare in seguito head.s. Nel 1991 Linus Torvalds aveva un HD di 40MB (basta guardare in config.h), 8MB di memoria e di sicuro un floppy drive da cui faceva il boot.
Presento qui delle parti di codice di boot.s (nei kernel più recenti si chiama bootsector.S), presenterò solo qui la parte di bootloader, il resto sarà dedicato al vero startup del kernel 2.6 (il lettore che vuole approfondire lo può fare leggendo direttamente l'intero codice dal sorgente):
BOOTSEG = 0x07c0
INITSEG = 0x9000
SYSSEG = 0x1000 | system loaded at 0x10000 (65536)
ENDSEG = SYSSEG + SYSSIZE
Qui sopra (esattamente come inizia boot.s) vengono definite le costanti degli indirizzi di memoria. La prima cosa che il BIOS fa quando trova un dispositivo di boot (in base alla signature) è quella di muovere i primi 512 bytes all'indirizzo di BOOTSEG.
entry start
start:
mov ax,#BOOTSEG
mov ds,ax | ds,es different data segments registers
mov ax,#INITSEG
...