Emulate RISC-V on QEMU for Windows x64

注意:本文不会使用 WSL2 这种曲线救国的方案,只会使用 QEMU for Windows 运行 Debian on RISC-V。还是非常缝合

效果图:

QEMU 模拟 RISC-V 效果
QEMU 模拟 RISC-V 效果

前言

RISC-V 是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。与大多数指令集相比,RISC-V指令集可以自由地用于任何目的,允许任何人设计、制造和销售RISC-V芯片软件而不必支付给任何公司专利费。

QEMU 是一款通用且免费的可执行硬件虚拟化的(hardware virtualization)开源仿真器(Emulator)。

为了开发和调试 RISC-V 平台上的软件,使用 QEMU 在趁手的机器上模拟执行 RISC-V 是必要的。我选择使用 Windows 作为开发的平台,Debian 作为 QEMU 中运行的操作系统。

下面开始部署教程。

安装必要的软件

我们需要三个必要的软件:

  • QEMU for Windows x64(不必多言)
  • OpenSBI:SBI (RISC-V Supervisor Binary Interface) 是在 RISC-V S 模式运行的硬件和操作系统之间的层,有点类似 BIOS。OpenSBI 是一种开源实现。
  • U-Boot:一个开源的主引导加载程序,提供一系列用于引导操作系统内核的指令。

QEMU 的下载安装毋须多言。

OpenSBI 和 U-Boot 都可以下载源码,在 Windows 上交叉编译得到用于 RISC-V 的二进制文件,但为了简单起见,我们直接从 Debian Archive 中下载预编译的版本。按照官方指引的说明,我们应当下载 unstable 版本:

下载完成后,会得到两个 .deb 软件包。使用 7-Zip 打开,将 usr 目录解压到同一位置

我们约定:D:\Debian-RISCV\usr 为上述文件的解压目录,以下操作均以此为准。

如果一切正常的话,我们可以找到两个文件:

  • D:\Debian-RISCV\usr\lib\riscv64-linux-gnu\opensbi\generic\fw_jump.elf
  • D:\Debian-RISCV\usr\lib\u-boot\qemu-riscv64_smode\uboot.elf

下载 Debian QCOW2 虚拟磁盘

我们可以创建 IMG 文件用作虚拟磁盘,但需要自行创建分区和写入 Debian 系统。为了方便起见,我们采用 Debian Quick Image Baker pre-baked images 提供的预制磁盘映像。

下载地址可以在上述页面 "Ports architectures" 一节中的 "Images for riscv64-virt" 处找到。

下载后我们会得到名为 artifacts.zip 的文件夹,将其中的 image.qcow2 解压到 D:\Debian-RISCV 中。

artifacts 中还含有一些 SSH 私钥,可以用于连接到 QEMU 模拟的系统中。详细的用法可以在压缩包内的 README 中找到。

配置和启动 QEMU

D:\Debian-RISCV 目录下打开 Powershell,运行:

qemu-system-riscv64 -machine virt -cpu rv64 -m 1G `
-append "root=LABEL=rootfs" `
-bios "D:\Debian-RISCV\usr\lib\riscv64-linux-gnu\opensbi\generic\fw_jump.elf" `
-kernel "D:\Debian-RISCV\usr\lib\u-boot\qemu-riscv64_smode\uboot.elf" `
-drive file=image.qcow2,if=none,id=hd `
-device virtio-blk-device,drive=hd `
-device virtio-net-device,netdev=net -netdev user,id=net,hostfwd=tcp::2222-:22 `
-device virtio-rng-device

然后就会弹出 QEMU 窗口,这时在 View 菜单中选择 serial0 接口就可以看到 Linux Shell 了。

切换 View
切换 View