Brans内核开发:Grub Multiboot头文件



我正在学习Bran的内核开发教程。在他的汇编代码中,他有以下代码块,他将这些代码块描述为不那么重要,但与GRUB有关。

; 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的背景下有一些特殊的意义?

这个程序集不是代码,而是一个多引导头。当您链接内核时,这个头将被放置在二进制文件的开头,因此GRUB可以看到您的内核是多引导兼容的。这个标头包含一个幻数(0x1badb002)、一个标志列表(在您的情况下,内核应该加载在页面对齐的地址上,并且您希望GRUB给您一个内存映射)和一个校验和。如果其中一个条目不遵循multiboot规范,GRUB将不会加载内核。

您可以在GRUB的multiboot手册中找到更多关于multiboot的信息:

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

引用手册:

操作系统映像除了包含操作系统映像使用的格式的标头外,还必须包含一个名为Multiboot标头的附加标头。Multiboot标头必须完全包含在操作系统映像的前8192个字节内,并且必须是长字(32位)对齐。一般来说,它应该尽可能早地出现,并且可能嵌入在真正的可执行文件头之后的文本段的开头。

我不知道AOUT的杂烩是干什么的。我只在操作系统中使用ELF。我遵循以下指南:http://wiki.osdev.org/Bare_Bones

相关内容

  • 没有找到相关文章

最新更新