【问题标题】:multiboot header doesn't work in boot file多重引导标头在引导文件中不起作用
【发布时间】:2013-08-21 02:08:10
【问题描述】:

我正在尝试使用 grub (legacy) 规范编写兼容的多引导内核,这是我的 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

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

【问题讨论】:

    标签: assembly kernel grub


    【解决方案1】:

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

    【讨论】:

    • 即使我换掉了sti 指令,我在eax 中的值始终相同,我什至添加了一个小型视频驱动程序来在屏幕上输出一些文本,但我什么也看不到。 @Martijn
    • 将 GDB 连接到 QEMU,逐步执行说明并跟踪 eax。
    • 问题不是我的 boot.s 文件,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2013-11-03
    • 2020-04-18
    • 2021-01-13
    • 2016-01-23
    • 2015-12-27
    相关资源
    最近更新 更多