5

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 (および私の以前のカーネル) の通常のコードと比較しましたが、何が間違っているのかわかりません。

4

1 に答える 1