我遇到了 Grub 2(和 QEMU's -kernel
)没有在我的内核中检测到 Multiboot v1 标头的问题。我之前在单独的部分中有标题.text
。
linker.ld
:
SECTIONS
{
. = 1M;
.multiboot ALIGN(4K) :
{
*(.multiboot)
}
.text ALIGN(4K) :
{
*(.text)
}
[snip]
boot.s
(GNU 作为语法):
.set MAGIC, 0x1badb002
.set FLAGS, (1<<0 | 1<<1) # align, provide mem map
.set CHECKSUM, -(MAGIC + FLAGS)
.section .multiboot
.long MAGIC
.long FLAGS
.long CHECKSUM
.section .text
[snip]
我已经验证了标题部分正在按照幻数指定的方式添加:
kernel.bin: file format elf32-i386
Contents of section .multiboot:
101000 02b0ad1b 03000000 fb4f52e4 .........OR.
Contents of section .text:
[snip]
然而 Grub 2 说内核没有有效的 Multiboot 标头,并且使用 QEMU 的-kernel
选项会导致:
qemu: fatal: Trying to execute code outside RAM or ROM at 0x000a000
这似乎是 BIOS 映射范围内的地址,而不是 Multiboot 应该在的位置。
我已经与 Bran 和 OSDev 中的常用代码(加上我以前的内核)进行了比较,但我似乎无法弄清楚我做错了什么。