multiboot标头在引导文件中不起作用

时间:2013-08-19 10:00:42

标签: assembly kernel grub

我正在尝试使用grub(旧版)规范编写兼容的多引导内核,这是我的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只返回我期望在%eax寄存器中的值0x01,但是当我执行内核时:

qemu -kernel kernel.bin -monitor stdio

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

1 个答案:

答案 0 :(得分:0)

您的图像很可能是正确的 - 如果QEMU不符合多重引导,则会抛出错误。调用kernel_main后,中断处理程序可能会使用eax,因为您使用sti启用了中断。