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