I'm having an issue with Grub 2 (and QEMU's -kernel
) not detecting the Multiboot v1 header in my kernel. I have the header in a separate section before .text
.
linker.ld
:
SECTIONS
{
. = 1M;
.multiboot ALIGN(4K) :
{
*(.multiboot)
}
.text ALIGN(4K) :
{
*(.text)
}
[snip]
boot.s
(GNU as syntax):
.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]
I have verified that the header section is being added as specified with the magic number:
kernel.bin: file format elf32-i386
Contents of section .multiboot:
101000 02b0ad1b 03000000 fb4f52e4 .........OR.
Contents of section .text:
[snip]
Yet Grub 2 says that the kernel does not have a valid Multiboot header, and using QEMU's -kernel
option causes:
qemu: fatal: Trying to execute code outside RAM or ROM at 0x000a000
which seems to be an address in the BIOS-mapped range, not where Multiboot should be.
I've compared against the usual code in Bran's and OSDev (plus a previous kernel of mine) yet I can't seem to figure out what I'm doing wrong.