【问题标题】:Why does grub-file say that NASM raw binary is not multiboot2 compliant?为什么 grub-file 说 NASM 原始二进制文件不兼容 multiboot2?
【发布时间】:2021-09-11 21:28:49
【问题描述】:

我正在尝试制作一个最小的内核。我的目标是让这个尚不存在的内核兼容 multiboot2。所以我首先在 NASM-Assembly 中创建了一个最小的 multiboot2-header。

我正在使用 grub-file 来测试我的二进制文件是否兼容。

问题:当我将文件组装到 elf32 时,grub-file 很高兴。 但是,当我使用 nasm 将我的头文件组装成原始二进制文件时,生成的文件不兼容。

这是为什么呢?在 multiboot2 规范中没有指定特定的可执行格式。

multiboot2header.asm:

section .multiboot
align 8,db 0
multibootheader_start:
    dd 0xE85250D6
    dd 0
    dd (multibootheader_end - multibootheader_start)
    dd -(0xE85250D6 + multibootheader_end - multibootheader_start)
multibootheader_end:

NASM 命令:

nasm -felf32 multiboot2header.asm -o multiboot2header.bin

nasm -fbin multiboot2header.asm -o multiboot2header.bin

grub 文件命令:

grub-file --is-x86-multiboot2 multiboot2header.bin

【问题讨论】:

    标签: kernel nasm osdev grub multiboot


    【解决方案1】:

    我怀疑问题是由于没有address tag 结构引起的(请参阅https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#Address-header-tag)。

    此标签对于 Elf 格式文件是可选的(因为引导加载程序只能使用 Elf 的头文件);但在其他情况下是必需的(因为引导加载程序不知道在哪里加载文件)。

    【讨论】:

    • 谢谢!再次查看文档后,我发现以下语句,证明了您的答案: 注意:如果内核映像为 ELF 格式,则不需要提供此信息,但如果映像为 a.out,则必须提供此信息格式或其他格式。当地址标签存在时,必须使用它来加载图像,无论是否还存在 ELF 标头。兼容的引导加载程序必须能够加载 ELF 格式或包含嵌入在 Multiboot2 标头中的地址标记的映像。
    猜你喜欢
    • 2020-09-25
    • 2011-08-03
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多