可查看更详细的安装和使用命令。同时,我们在每次开机之后要使用此命令来允许模拟器过量使用内存(不是必须的),否则无法正常使用 Qemu:
$ sudo sysctl vm.overcommit_memory=1
如果你在使用 macOS,只需要 Homebrew 一个命令即可:
最后确认一下 Qemu 已经安装好,且版本在 4.1.0 以上:
$ qemu-system-riscv64 --version
QEMU emulator version 4.1.1
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
新版 Qemu 中内置了 firrmwire
(固件),它主要负责在操作系统运行前的硬件初始化和加载操作系统的功能。我们使用以下命令尝试运行一下:
为了确信我们已经跑起来了内核里面的代码,我们最好在 rust_main
里面加一点东西。
// src/main.rs
#![feature(asm)]
pub fn console_putchar(ch: u8) {
let ret: usize;
let arg0: usize = ch as usize;
let arg1: usize = 0;
let arg2: usize = 0;
let which: usize = 1;
unsafe {
asm!("ecall"
: "={x10}" (ret)
: "{x10}" (arg0), "{x11}" (arg1), "{x12}" (arg2), "{x17}" (which)
: "memory"
: "volatile"
);
}
#[no_mangle]
extern "C" fn rust_main() -> ! {
console_putchar(b'O');
console_putchar(b'K');
console_putchar(b'\n');
loop {}
}
这样,如果我们将内核镜像加载完成后,屏幕上出现了 OK ,就说明我们之前做的事情没有问题。如果想进一步了解上面例子中的内联汇编(“asm!”),请参考 附录:内联汇编 。
现在我们生成内核镜像要通过多条命令来完成,我们通过 Makefile
来简化这一过程。
于是,我们可以使用 make run
来用 Qemu 加载内核镜像并运行。匆匆翻过一串长长的 OpenSBI 输出,我们看到了 OK
!于是历经了千辛万苦我们终于将我们的内核跑起来了!
没有看到 OK ?迄今为止的代码可以在找到,请参考。
扩展内容
也许有同学对qemu-system-riscv64
模拟的virt machine
计算机的硬件配置感兴趣,那么通过如下命令,可以看到到当前virt machine
的硬件配置信息:
$ sudo apt install device-tree-compiler #安装device tree编译器/解释器 dtc
$ qemu-system-riscv64 -machine virt -machine dumpdtb=riscv64-virt.dtb -bios default #生成virt machine计算机的二进制device tree信息
$ dtc -I dtb -O dts -o riscv64-virt.dts riscv64-virt.dtb #转换为文本格式的device tree信息
下一节我们实现格式化输出来使得我们后续能够更加方便的通过输出来进行内核调试。