RISC-V 模拟从零搭建开发环境
RISC-V 与 QEMU
RISC-V 是开源精简指令集架构,快速流行于嵌入式、IoT、学术研究领域。QEMU 对 RISC-V 支持非常完整,系统级和用户态模拟都能跑。
QEMU 10.x+ 对 RISC-V 的模拟日趋成熟:支持 RV64(64 位)、RV32(32 位)、IMAFDC 标准扩展、以及虚拟化扩展(H)。
两种 RISC-V 板卡
| 板卡 | 说明 | 推荐场景 |
|---|---|---|
virt | QEMU 虚拟 RISC-V 服务器板 | 跑完整 Linux 发行版,通用推荐 |
sifive_e | SiFive 虚拟开发板 | 嵌入式、RTOS 开发 |
大多数人用 -M virt,设备覆盖最广。
模拟 RISC-V Linux(virt 板)
方式一:直接引导内核(推荐)
准备:
- RISC-V 交叉编译工具链里的内核(或从发行版 ISO 提取)
- 根文件系统 qcow2
qemu-system-riscv64 \
-M virt \
-m 4G \
-cpu max \
-kernel vmlinuz-riscv64 \
-initrd initrd-riscv64 \
-drive file=rootfs-riscv.qcow2,format=qcow2,if=virtio \
-append "root=/dev/vda1 console=ttyS0" \
-netdev user,id=n0,hostfwd=tcp::2223-:22 \
-device virtio-net-pci,netdev=n0 \
-nographic
关键差异(对比 ARM 模拟):
- CPU 是
riscv64还是riscv32 - 内核参数里控制台是
console=ttyS0(ARM 是ttyAMA0) -M virt在 RISC-V 上同样是通用板卡
方式二:走 OpenSBI + U-Boot 引导(传统方式)
RISC-V 规范里,OpenSBI(Open Source Supervisor Binary Interface)是引导链的第一阶段:
OpenSBI → U-Boot → Linux Kernel
QEMU 已经内置了 OpenSBI(-bios default 或 -bios /path/to/opensbi.elf),然后引导 U-Boot。这种方式更接近真实硬件,但调试引导链复杂。直接用 -kernel 跳过最简单。
发行版 ISO 引导
qemu-system-riscv64 \
-M virt -m 8G -cpu max \
-bios default \
-cdrom ubuntu-24.04-live-server-riscv64.iso \
-drive file=rootfs-riscv.qcow2,format=qcow2,if=virtio \
-nic user,hostfwd=tcp::2223-:22 \
-nographic
用户态 RISC-V 模拟
不需要完整系统,跑单个二进制:
# 安装
sudo apt install qemu-user
# 模拟运行 RISC-V 编译的 hello world
qemu-riscv64 ./riscv-hello
# 带根文件系统(完整用户环境)
qemu-riscv64-L /opt/riscv-rootfs ./my-riscv-app
用户态模拟非常轻量,速度是全系统模拟的 5~10 倍。适合快速验证 RISC-V 编译产物。
GDB 调试 RISC-V 内核
# QEMU 侧
qemu-system-riscv64 \
-M virt -m 4G -smp 4 \
-kernel vmlinuz -initrd initrd \
-drive file=rootfs.qcow2,format=qcow2 \
-append "root=/dev/vda1 nokaslr console=ttyS0" \
-s -S \
-nographic
# GDB 侧
riscv64-unknown-elf-gdb vmlinux
(gdb) target remote :1234
SiFive 开发板模拟
如果需要模拟更接近真实硬件的环境:
qemu-system-riscv64 \
-M sifive_e \
-m 2G \
-nographic
SiFive E 系列是经典的 RISC-V 开发板模拟,常用于 rCore 等 OS 课程。
RISC-V 虚拟化扩展(H 扩展)
QEMU 10.x 开始更好地支持 RISC-V H 扩展(硬件虚拟化)。配置 Guest 时开启:
qemu-system-riscv64 \
-M virt \
-cpu max,virt=on \
...
交叉编译 + QEMU 验证的工作流
典型的嵌入式开发工作流:
# 1. 交叉编译 RISC-V 内核
riscv64-linux-gnu-make ARCH=riscv
# 2. 打包 rootfs
...
# 3. 启动 QEMU 系统模拟验证
qemu-system-riscv64 -M virt -kernel vmlinuz ... -nographic
# 4. 内核调试
qemu-system-riscv64 -M virt -s -S ...
riscv64-unknown-elf-gdb vmlinux