【问题标题】:Why won't me custom kernel launch in QEMU?为什么我不能在 QEMU 中启动自定义内核?
【发布时间】:2023-03-10 10:17:01
【问题描述】:

出于爱好/学习目的,我正在考虑创建自己的操作系统。

我创建了一个简单的 rust 程序,但无法使用 QEMU 启动它。我的 rust 代码如下所示。

#![no_std]
#![no_main]

mod panic;

#[no_mangle]
pub extern "C" fn _start() -> ! {
    loop{}
}

我正在将其编译为以下格式。

riscv64gc-unknown-none-elf

并尝试使用此命令在 QEMU 中运行它

qemu-system-riscv64 -M virt -bios none -kernel

这将启动 QEMU,但调试工具在内存中没有显示任何内容。

我可以看到它不在内存中的正确位置,因此我将以下参数添加到链接器,以便将其加载到正确的位置(内存开头)。

--image-base=0x80000000

我可以看到它现在位于正确的位置,但不会执行任何操作,因为在 0x80000000 的起始地址处没有有效代码,因为 elf 标头是那里的第一件事。

我的印象是QEMU能够读取elf文件并跳转到header中指定的入口地址。这不是真的还是我只是错过了什么?

【问题讨论】:

    标签: rust qemu elf osdev riscv


    【解决方案1】:

    QEMU 可能已经确定您的 ELF 文件格式不正确并退回到“假设这是一个原始二进制文件”。如果你想调试出了什么问题,你可以在 gdb 下运行 QEMU 并查看以 riscv_load_kernel() 函数开头的代码路径。

    不过,更一般地说,QEMU 中的“-kernel”行为是依赖于架构的,但主要是为“引导 Linux 内核”而设计的。因此,如果您确定要构建自定义操作系统以匹配 Linux 使用的映像格式和引导协议,那么它就是正确的选择。不过,如果您只是构建一个随机 ELF 文件并希望 QEMU 从其入口点启动,您可能会发现 generic loader 更合适。

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 1970-01-01
      • 2017-10-30
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 2013-10-12
      • 1970-01-01
      相关资源
      最近更新 更多