|
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
|