【问题标题】:Brans Kernel Development : Grub Multiboot header?Brans 内核开发:Grub Multiboot 头文件?
【发布时间】:2012-08-02 11:20:39
【问题描述】:

我正在关注 Bran 的内核开发tutorial。在他的汇编代码中,他有以下代码块,他将其描述为不那么重要,但与 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 的上下文中具有某些特殊意义?

【问题讨论】:

    标签: kernel grub


    【解决方案1】:

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

    您可以在 GRUB 的多重引导手册中找到有关多重引导的更多信息:

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

    引用手册:

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

    我不确定 AOUT kludge 的作用。我只在我的操作系统中使用 ELF。 我遵循了这个指南:http://wiki.osdev.org/Bare_Bones

    【讨论】:

      猜你喜欢
      • 2015-02-28
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2021-07-16
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多