1

我正在尝试使用 grub (legacy) 规范编写兼容的多引导内核,这是我的 boot.s 的内容(用 gnu 编写)

#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 只是返回值 0x01 ,这是我在 %eax 寄存器中所期望的,但是当我使用以下命令执行内核时:

qemu -kernel kernel.bin -monitor stdio

然后info registers在 qemu 中发出命令,我总是为 %eax 找到 18 的值。所以我的问题是:我的 boot.s 文件是否正确定义为兼容 grub?为什么 %eax 中的值是 18 而不是 0x01?

4

1 回答 1

0

您的图像很可能是正确的 - 如果 QEMU 不兼容多重引导,它将引发错误。eax在您调用 kernel_main 之后,中断处理程序可能会使用它,因为您使用sti.

于 2013-08-19T12:53:18.463 回答