全网有各种Qemu运行riscv linux的教程,有点杂,在此做一个总结分类。

要成功运行起来不难也不容易,跑不通最大的原因可能是版本问题,包括Qemu的版本、Opensbi版本、Linux的版本、BBL版本。

硬件上启动Linux需要准备三样东西:bootloader、Linux 内核、根文件系统。bootloader可以是opensbi(Open Supervisor Binary Interface)、bbl(Berkeyly Boot Loader)。根文件系统可以通过busy_box配置,也可以是各类linux发行版。

Qemu是硬件仿真器,可以将它当成一个实际的硬件,包含地址映射、外设等。

spike是指令集的模拟器,也是可以当成是硬件,但它与Qemu不同,只能解析二进制指令,Qemu还可以解析elf文件。有关spike、pk、fesrv可以参考这两篇文章:深入理解基于RISC-V ISS Spike的仿真系统:探索Spike,pk和fesrv华科OS教程:RISC-V体系结构

一、Qemu 运行

1、默认opensbi + 独立Image + 独立rootfs

搭建qemu RISC-V运行Linux环境 汪辰,在 QEMU 上运行 RISC-V 64 位版本的 Linux

qemu-system-riscv64 -M virt \
		    -m 256M \
		    -nographic \
		    -bios default\
		    -kernel linux/arch/riscv/boot/Image\
		    -drive file=rootfs.img,format=raw,id=hd0 \
		    -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"

2、opensbi包Image+独立rootfs

risc-v linux 根文件系统制作和运行 先生成linux内核文件Image,然后用opensbi的PAYLOAD选项将内核一起包入编译。最后运行时一定要加上-bios none否则会出现地址冲突错误。

qemu-system-riscv64 -M virt \
		    -m 256M \
		    -nographic \
		    -bios none\
		    -kernel opensbi/build/platform/generic/firmware/fw_payload.elf\
		    -drive file=rootfs.img,format=raw,id=hd0 \
		    -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"

3、独立opensbi+独立Image+独立rootfs JUMP方式

构建riscv上运行的linux系统

qemu-system-riscv64 -M virt \
		    -m 256M \
		    -nographic \
		    -bios opensbi/build/platform/generic/firmware/fw_jump.bin\
		    -kernel linux/arch/riscv/boot/Image\
		    -drive file=rootfs.img,format=raw,id=hd0 \
		    -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"

4、opensbi包Linux内核

RISC-V Kurun的博客只加载内核,无设备树。

qemu-system-riscv64 -M virt \
		    -m 256M \
		    -nographic \
		    -bios opensbi/build/platform/generic/firmware/fw_jump.bin\

5、opensbi包hello payload模式

opensbi下的riscv64裸机系列编程1(串口输出)

payload的文件一定是bin文件,file xx. bin会显示data,可以通过 riscv64-unknown-elf-objcope -O binary xx.elf xx.bin生成bin文件。

qemu-system-riscv64 -M virt 
          -m 256M\
          -nographic\
          -bios build/platform/generic/firmware/fw_payload.elf 

6、bbl包Image+rootfs

未验证 How to Run Linux on RISC-V with QEMU Emulator - CNX Software qemu引导riscv linux--摆脱busybear

 qemu-system-riscv64  -M virt \
                    -m 256M \
                    -nographic\
                    -kernel bbl \
                    -drive file=busybear.bin,format=raw,id=hd0\
                  -device virtio-blk-device,drive=hd0  -append "root=/dev/vda ro console=ttyS0"         
                  -netdev type=tap,script=./ifup,downscript=./ifdown,id=net0   
                  -device virtio-net-device,netdev=net0

二、Spike 运行

Image包rootfs ,bbl 包 Image。这种方式的启动和版本更加有关系 Spike模拟Linux 5.3教程 Spike 运行RISC-V Linux实践 bbl制作

LiteX and RocketChip

附录

# 1.查看qemu设备树
qemu-system-riscv64 -machine virt,dumpdtb=qemu-riscv64-virt.dtb
dtc qemu-riscv64-virt.dtb > qemu-riscv64-virt.dts
# 2.qemu debug模式
qemu-system-riscv32 -M virt -m 256M -kernel opensbi-1.0/build/platform/generic/firmware/fw_payload.elf -nographic -bios none  -smp 1 -s -S

riscv32-unknown-linux-gnu-gdb build/linux-5.16.12/vmlinux
target remote localhost:1234

标签: riscv, Qemu, linux

添加新评论