2012-08-04 25 views
2

我正在關注Bran的內核開發tutorial。在他的彙編代碼中,他具有以下代碼塊,他描述的不是那麼重要,而是一些與GRUB相關的代碼。Brans內核開發:Grub Multiboot頭?

; This part MUST be 4byte aligned, so we solve that issue using 'ALIGN 4' 
ALIGN 4 
mboot: 
    ; Multiboot macros to make a few lines later more readable 
    MULTIBOOT_PAGE_ALIGN equ 1<<0 
    MULTIBOOT_MEMORY_INFO equ 1<<1 
    MULTIBOOT_AOUT_KLUDGE equ 1<<16 
    MULTIBOOT_HEADER_MAGIC equ 0x1BADB002 
    MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO |  MULTIBOOT_AOUT_KLUDGE 
    MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) 
    EXTERN code, bss, end 

    ; This is the GRUB Multiboot header. A boot signature 
    dd MULTIBOOT_HEADER_MAGIC 
    dd MULTIBOOT_HEADER_FLAGS 
    dd MULTIBOOT_CHECKSUM 

    ; AOUT kludge - must be physical addresses. Make a note of these: 
    ; The linker script fills in the data for these ones! 
    dd mboot 
    dd code 
    dd bss 
    dd end 
    dd start 

我還是想知道這是什麼代碼是幹什麼的?有人可以給我或指向我在哪裏可以找到關於此的描述。其次,爲什麼這段代碼需要4字節對齊?這是出於效率原因還是在GRUB背景下具有特殊意義?

回答

7

這一部分的程序集不是代碼,而是一個多引導頭。當你鏈接你的內核時,這個頭文件將被放置在二進制文件的開頭,所以GRUB可以看到你的內核是兼容多引導的。 這個頭文件包含一個幻數(0x1badb002),一個標記列表(在你的情況下,內核應該加載到一個頁面對齊的地址,並且你希望GRUB給你一個內存映射)和一個校驗和。 如果其中一個條目不符合多引導規範,GRUB將不會加載您的內核。

可以在GRUB的多重手動找到多重的更多信息:

http://www.gnu.org/software/grub/manual/multiboot/multiboot.html

從手動引用:

操作系統映像必須包含一個稱爲多重引導頭的附加頭,除了OS映像使用的格式的標題。多引導標題必須完全包含在OS映像的前8192個字節內,並且必須是長字(32位)對齊。一般來說,它應該儘早出現,並且可能會嵌入在真正的可執行頭之後的文本段的開頭。

我不確定AOUT kludge會做什麼。我只在我的操作系統中使用ELF。我遵循本指南:http://wiki.osdev.org/Bare_Bones