1

grub (レガシー) 仕様を使用してマルチブート カーネルに準拠したものを作成しようとしています。これが私の boot.s の内容です (gnu as で作成)

#include "boot.h"
    .code32
    .globl start
    .type start, @function
    .extern kernel_main
    .type kernel_main, @function
    .bss
    .comm stack, STACK_SIZE

    .section .mboot
    .align 4
    .long MBOOT_HEADER_MAGIC
    .long MBOOT_HEADER_FLAGS
    .long MBOOT_CHECKSUM
        .text
start:
    movl $(stack + STACK_SIZE) , %esp
    cli
    call kernel_main
    sti
    hlt
    jmp .

boot.h ファイルには、grub の定義が含まれています。

#ifndef _BOOT_H_
#define _BOOT_H_
#define MBOOT_PAGE_ALIGN 1<<0
#define MBOOT_MEM_INFO 1<<1
#define MBOOT_HEADER_MAGIC 0x1BADB002
#define MBOOT_HEADER_FLAGS MBOOT_PAGE_ALIGN | MBOOT_MEM_INFO
#define MBOOT_CHECKSUM -( MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)
#define STACK_SIZE 0x4000
#endif /* _BOOT_H_ */

また、リンカーを次のように設定しました。

ENTRY(start)
OUTPUT_ARCH(i386)
OUTPUT_FORMAT("elf32-i386")
SECTIONS
{
    . = 1M;
    .mboot ALIGN(4K) :
    {
        *(.mboot)

    }
    .text ALIGN(4K) :
    {
        *(.text)
        *(.rodata)
    }
    .data ALIGN(4K) :
    {
        *(.data)
    }
    .bss ALIGN(4K) :
    {
        *(.bss)
    }
}

今のところ、kernel_main は %eax レジスタで期待している値 0x01 を返すだけですが、カーネルを次のように実行すると、次のようになります。

qemu -kernel kernel.bin -monitor stdio

info registersqemu でコマンドを発行すると、 %eax の値は常に 18 になります。私の質問は次のとおりです。私の boot.s ファイルは grub に準拠するように正しく定義されていますか? また、%eax の値が 0x01 ではなく 18 である理由は何ですか?

4

1 に答える 1

0

イメージが正しい可能性が高いです。マルチブートに準拠していない場合、QEMU はエラーをスローします。eaxで割り込みを有効にしているため、おそらくkernel_mainへの呼び出し後に割り込みハンドラによって使用されますsti

于 2013-08-19T12:53:18.463 に答える