back

Supponendo di aver costruito una immagine di bzImage (__BIG_KERNEL__ Nota: bImage è stata abbandonata a partire dal protocollo di boot 2.02 [6]) ecco cosa troviamo nel Makefile in linux/arch/i386/boot/Makefile:

bzImage         $(OBJCOPY) compressed/bvmlinux compressed/bvmlinux.out
                tools/build -b bbootsect bsetup compressed/bvmlinux.out
                $(ROOT_DEV) \
                        > bzImage

A questo punto setup.S esegue:

1. alcune inizializzazioni hardware (calcola la memoria estesa presente nel sistema, tastiera, MCA, hard disk e mouse)

2. verifica se il BIOS supporta l'APM

3. inizializza l'A20

4. Prepara per la modalità protetta code32_start che è inizializzato a 0x1000 per zImage o 0x100000 per bzImage. Il valore di code32 verrà utilizzato passando il controllo a linux/arch/i386/boot/compressed/head.S.

5. Cambia in modalità protetta

A questo punto il controllo passa alla routine che "esploderà" l'immagine del kernel in memoria al primo mega (0x100000) e a questo punto head.S salterà al vero inizio del kernel (arch/i386/kernel/head.S che è l'inizio del kernel decompresso).

Riporto i campi dell'header di setup.S per mostrare come il bootloader e il setup interagiscano per passarsi le informazioni della command line o dell'indirizzo dove si trova l'initrd. setup si aspetta che alcuni valori siano valorizzati dal bootloader alla sua partenza:

Offset  Proto   Name            Meaning
/Size
0200/2  2.00+ jump            Jump instruction
0202/4  2.00+ header          Magic signature "HdrS"
0206/2  2.00+ version         Boot protocol version supported
0208/4  2.00+ realmode_swtch  Boot loader hook
020C/2  2.00+ start_sys       The load-low segment (0x1000) (obsolete)
020E/2  2.00+ kernel_version  Pointer to kernel version string
0210/1  2.00+ type_of_loader  Boot loader identifier
0211/1  2.00+ loadflags       Boot protocol option flags
0212/2  2.00+ setup_move_size Move to high memory size (used with hooks)
0214/4  2.00+ code32_start    Boot loader hook
0218/4  2.00+ ramdisk_image   initrd load address (set by boot loader)
021C/4  2.00+ ramdisk_size    initrd size (set by boot loader)
0220/4  2.00+ bootsect_kludge DO NOT USE - for bootsect.S use only
0224/2  2.01+ heap_end_ptr    Free memory after setup end
0226/2  N/A   pad1            Unused
0228/4  2.02+ cmd_line_ptr    32-bit pointer to the kernel command line
022C/4  2.03+ initrd_addr_max Highest legal initrd address
back