GNU GRUB

Aşağıdaki GNU GRUB program taslağı grub-0.93 tabanlıdır.

stage2/stage2.c:cmain()
`-- run_menu()
    `-- run_script();
        |-- builtin = find_command(heap);
        |-- kernel_func();            // "kernel" komutu için builtin->func()
        |   `-- load_image();         // boot.c içinde BOOTSEC_SIGNATURE'ı ara
        |   /* 0x100000'dan başlayan bellek (bvmlinux, bbootsect, bsetup)
        |    * veya (vmlinux, bootsect, setup) sırasında onlar tarafından
             * doldurulur */
        |-- initrd_func();            // "initrd" komutu için
        |   `-- load_initrd();
        `-- boot_func();              // örtük "boot" komutu için
            `-- linux_boot();         // stage2/asm.S içinde tanımlı
                or big_linux_boot();  // grub/asmstub.c! içinde değil

// stage2/asm.S içinde
linux_boot:
        /* çekirdeği kopyala */
        sistem kodunu 0x100000 adresinden 0x10000 adresine
          taşı (linux_text_len bytes);
big_linux_boot:
        /* gerçek kip kısmını kopyala */
        EBX = linux_data_real_addr;
        kurulum kodunu linux_data_tmp_addr (0x100000+text_len) adresinden
            linux_data_real_addr (0x9100 bytes) adresine taşı;
        /* %ebx değerini bölüt adresi olarak değiştir*/
        linux_setup_seg = (EBX >> 4) + 0x20;
        /* XXX çağıran işlevler için güvenli alandaki yeni yığıt göstericisi
        ESP = 0x4000;
        stop_floppy();
        /* linux önyüklemesi için son ayarlama */
        prot_to_real();
        cli;
        SS:ESP = BX:9000;
        DS = ES = FS = GS = BX;
        /* başlangıca sıçra, örn. ljmp linux_setup_seg:0
         * Dikkat ederseniz linux_setup_seg BX olarak değiştirildi. */
        .byte   0xea
        .word   0
linux_setup_seg:
        .word   0

GRUB kılavuzu için info grub'a bakın.

grub-0.93'ü uyarlıyorsanız ve bsetup'da değişiklik yapacaksanız bildirilmiş tek GNU GRUB hatası dikkate alınmalıdır.