Qemu搭建RISC-V,运行opensbi+u-boot+img

使用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
  • 通过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

七、进阶配置:自定义启动流程

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核心数或内存大小等。

你可能感兴趣的:(数据库)