使用Qemu搭建RISC-V开发环境并运行opensbi+u-boot+img
一、环境准备与依赖安装
1. 安装Qemu(需支持RISC-V)
# Ubuntu/Debian系统
sudo apt-get update
sudo apt-get install qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu
# CentOS/RHEL系统
sudo dnf install qemu-system-x86 gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu
# 验证Qemu版本(需>=4.0,推荐6.0+)
qemu-system-riscv64 --version
2. 安装编译工具链与依赖
sudo apt-get install make autoconf automake libtool pkg-config device-tree-compiler
二、获取与编译opensbi(OpenSBI)
1. 克隆opensbi仓库
git clone https://github.com/riscv-software-src/opensbi.git
cd opensbi
git checkout v1.2 # 或其他稳定版本
2. 配置与编译
# 针对Qemu的RISC-V64配置
make CROSS_COMPILE=riscv64-unknown-elf- PLAT=qemu DEBUG=0
# 编译结果在build/qemu/release目录下
3. 关键文件说明
build/qemu/release/opensbi.bin
:OpenSBI固件二进制文件
三、获取与编译u-boot
1. 克隆u-boot仓库
git clone https://github.com/u-boot/u-boot.git
cd u-boot
git checkout v2023.04 # 或其他稳定版本
2. 配置与编译
# 清除旧配置(首次可跳过)
make distclean
# 设置Qemu RISC-V64配置
make qemu_riscv64_defconfig
# 编译u-boot(需指定交叉编译器)
make CROSS_COMPILE=riscv64-linux-gnu- -j$(nproc)
3. 关键文件说明
u-boot.bin
:u-boot二进制文件u-boot.dtb
:Qemu RISC-V设备树文件(若需要自定义设备树,可修改arch/riscv/dts/qemu_riscv64.dts
后重新编译)
四、准备操作系统镜像(以Linux为例)
1. 编译Linux内核
git clone https://github.com/torvalds/linux.git
cd linux
git checkout v6.1 # 或其他版本
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -j$(nproc)
- 内核镜像:
arch/riscv/boot/Image
2. 准备根文件系统(以Buildroot为例)
git clone https://buildroot.org/buildroot.git
cd buildroot
make qemu_riscv64_defconfig
make
- 根文件系统镜像:
output/images/rootfs.ext2
五、使用Qemu启动全流程
1. 单命令启动流程(opensbi+u-boot+Linux)
qemu-system-riscv64 \
-machine virt -smp 4 -m 4G \
-bios build/qemu/release/opensbi.bin \
-device virtio-blk-device,drive=hd0 \
-drive file=u-boot.bin,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd1 \
-drive file=arch/riscv/boot/Image,format=raw,id=hd1 \
-device virtio-blk-device,drive=hd2 \
-drive file=output/images/rootfs.ext2,format=raw,id=hd2 \
-device virtio-net-device,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::5555-:22 \
-nographic \
-serial mon:stdio
2. 分步启动说明
通过opensbi加载u-boot:
qemu-system-riscv64 \ -machine virt -smp 4 -m 4G \ -bios build/qemu/release/opensbi.bin \ -device virtio-blk-device,drive=uboot \ -drive file=u-boot.bin,format=raw,id=uboot \ -nographic \ -serial mon:stdio
- 在opensbi控制台输入:
load_image 0x80200000 u-boot.bin; boot_image 0x80200000
- 在opensbi控制台输入:
通过u-boot加载Linux内核:
# 在u-boot控制台中设置启动参数 setenv bootargs "console=ttyS0,115200 root=/dev/vda2 rw rootwait" setenv fdtfile u-boot.dtb load dev 0:1 0x80200000 Image load dev 0:1 0x80f00000 u-boot.dtb bootz 0x80200000 - 0x80f00000
六、常见问题与解决方案
1. 编译错误:找不到riscv64-unknown-elf-gcc
- 原因:交叉编译工具链未安装或路径未添加到环境变量
解决:
# 确认工具链安装路径(以Ubuntu为例) sudo apt-get install gcc-riscv64-unknown-elf export PATH=$PATH:/usr/bin # 或工具链实际安装路径
2. Qemu启动时提示“no bootable device”
- 原因:固件路径错误或启动顺序配置问题
解决:
- 检查
-bios
参数是否指向正确的opensbi.bin路径 - 确认u-boot.bin已正确挂载到Qemu虚拟设备
- 检查
3. u-boot无法加载内核
- 原因:设备树不匹配或启动参数错误
解决:
- 确保使用Qemu对应的设备树文件(
u-boot.dtb
) - 检查
bootargs
参数是否包含正确的根文件系统设备(如root=/dev/vda2
)
- 确保使用Qemu对应的设备树文件(
七、进阶配置:自定义启动流程
1. 保存u-boot环境变量
# 在u-boot中设置永久环境变量
setenv bootcmd "load mmc 0:1 0x80200000 Image; load mmc 0:1 0x80f00000 u-boot.dtb; bootz 0x80200000 - 0x80f00000"
saveenv
2. 使用NFS挂载根文件系统
在u-boot中设置:
setenv bootargs "console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.100:/nfs/rootfs,rw ip=192.168.1.101:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off"
Qemu添加网络参数:
-device virtio-net-device,netdev=net0 \ -netdev user,id=net0,hostfwd=tcp::5555-:22,hostaddr=192.168.1.100
通过以上步骤,你可以在Qemu中成功搭建RISC-V开发环境,并实现从opensbi到u-boot再到操作系统镜像的完整启动流程。根据实际需求,你还可以进一步优化配置,如添加PCI设备、调整CPU核心数或内存大小等。