Emulate RISC-V on QEMU for Windows x64
注意:本文不会使用 WSL2 这种曲线救国的方案,只会使用 QEMU for Windows 运行 Debian on 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 了。
登录的密码是啥呀?文中没提到,我尝试root,root进去了
在下载的镜像中应该有个 README 文件。我记得里面有镜像的密码(
"下载完成后,会得到两个 .deb 软件包。使用 7-Zip 打开,将 usr 目录解压到同一位置。"这句话是什么意思,什么是将usr目录解压到同一位置?这个怎么操作?我只会分别解压成两个目录
解压之后会有两个目录,其中都有 usr,把他们合并起来。