Grub 2 (および QEMU の-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 は、カーネルに有効なマルチブート ヘッダーがなく、QEMU の-kernel
オプションを使用すると次の原因になると述べています。
qemu: fatal: Trying to execute code outside RAM or ROM at 0x000a000
これは、マルチブートがあるべき場所ではなく、BIOS によってマップされた範囲内のアドレスのようです。
Bran と OSDev (および私の以前のカーネル) の通常のコードと比較しましたが、何が間違っているのかわかりません。