Qemu模拟riscv

1.qemu可以不用自己编译,直接apt安装,但前提是系统版本比较新,否则apt库没有要自己编译
2.自己编译qemu的话,选5.1的版本,可以直接编译安装,5.2之后的版本对python有要求,编译起来麻烦些
3.编译busybox,一定要在menuconfig里选择static,不要选动态库编译,否则模拟后会导致无法正常加载程序
4.riscv-gcc,可以不用自己编译,高版本的系统可以直接安装,旧版本的,可以用那个网站下载,或者自己编译


uboot 全架构,但配置麻烦
bbl, riscv专用,配置简单
opensbi :暂时不知道干嘛的,不指定的话,貌似会用qemu自带的比较旧的0.7,可以通过buildroot编译后生成的,1.6的比较新,-bios fw_jump.bin,昨天在qemu5.0无法启动,
提示没有bios,gpt也说是缺乏这个固件,难道qemu5.0没有自带riscv的固件?

利用docker构建alpine跟文件系统,参考luckfox
https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-Alpine-Linux-2

挂载镜像修改qemu模拟的系统的rootfs.img的时候,通过sync可以快速刷新修改,让qemu那边及时看到效果

git clone https://github.com/buildroot/buildroot.git
make qemu_riscv64_virt_defconfig (使用默认riscv配置,或者也可也自己menuconfig配置,或比较麻烦)
make -j32

buildroot编译好后,固件,内核,rootfs都在output/image里,不要直接用它下面的start-qemu.sh运行,因为它没指定虚拟驱动器为块设备,会导致没有生成/dev/vda,一直卡在rootwait那,-device virtio-blk-device,drive=hd0
完整运行命令:
sudo qemu-system-riscv64 -M virt -m 256M -nographic -kernel Image -drive file=rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0" -netdev user,id=net0 -device virtio-net-device,netdev=net0
或 sudoqemu-system-riscv64 -M virt -m 256M -nographic -kernel Image -drive file=rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda rw" -netdev user,id=net0 -device virtio-net-device,netdev=net0

注意:这个默认的配置的系统是只读的

qemu-system-xxx中的system表示这个是可以模拟操作系统的,比如qemu-riscv就不能运行linux

3. -M virt
说明:M表示要模拟的目标机器板卡,例如树莓派香橙派什么,指定虚拟机的类型。因为riscv比较新,支持的板卡不多,只有官方的几个,所以这里选virt ,是一个通用的虚拟机器类型,适用于大多数现代操作系统和开发环境。

4. -m 256M
说明:分配给虚拟机的内存大小,这里设置为256MB。内存大小可以根据使用场景进行调整。
5. -nographic
说明:禁用图形输出。QEMU 将不创建图形窗口,而是将所有输出重定向到控制台。这通常用于无人值守的虚拟机和嵌入式开发。
6. -kernel Image
说明:指定要加载的内核映像文件。在这个例子中,Image 是您想要加载的内核文件,也就是RISC-V的 Linux 内核映像。
7. -drive file=rootfs.ext2,format=raw,id=hd0
说明:配置虚拟机的驱动器。在这里,您指定要使用的根文件系统映像。
file=rootfs.ext2:寻找名为 rootfs.ext2 的文件作为根文件系统。
format=raw:指定映像文件的格式,raw 表示未压缩的原始格式。
id=hd0:为这个驱动器指定一个唯一的标识符。
8. -device virtio-blk-device,drive=hd0
说明:配置虚拟块设备,使用 VirtIO 协议来提高性能。这里指定的驱动器是之前定义的 hd0。
9. -append "root=/dev/vda rw console=ttyS0"
说明:传递引导参数给内核。
root=/dev/vda:告诉内核根文件系统的位置,/dev/vda 是使用 VirtIO 设备定义的块设备。
rw:以读写模式挂载根文件系统。
console=ttyS0:将内核的控制台输出重定向到 ttyS0,这是一个虚拟串口。
10. -netdev user,id=net0
说明:配置虚拟网络设备,将用户网络堆栈作为网络后端。id=net0 用来标识这个网络设备。
11. -device virtio-net-device,netdev=net0
说明:配置 VirtIO 网络设备,使用之前定义的 net0 网络设置。VirtIO 驱动程序通常可以处理性能更好的网络连接。

posted @   JeasonBoy  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示