第一层qemu 我们这里用qemu主线的当前最新版本,v7.0.0, 正常编译就好。
host内核 我们这里用v5.19主线内核,使用riscv的defconfig编译, 注意要加上KVM的编译选项。
第二层qemu 这个qemu的编译比较有意思,因为qemu编译需要依赖很多动态库,我用的都是交叉编译编译 riscv的程序,所以,需要先交叉编译qemu依赖的动态库,然后再交叉编译qemu,太麻烦了。 我们这里用编译buildroot的方式一同编译小文件系统里的qemu, buildroot编译qemu的时候 就会一同编译qemu依赖的各种库, 这样编译出的host文件系统里就带了qemu。
下载buildroot的源码:git clone git://git.buildroot.net/buildroot
这个时间点下载的buildroot的源码的commit id是934788d1,这个版本的buildroot需要 hack下,使riscv构架下可以编译qemu和cmake:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 diff --git a/package/qemu/Config.in b/package/qemu/Config.in index e960a062cb..715d6571d9 100644 --- a/package/qemu/Config.in +++ b/package/qemu/Config.in @@ -9,6 +9,7 @@ config BR2_PACKAGE_QEMU_ARCH_SUPPORTS_TARGET default y if BR2_powerpc64 default y if BR2_powerpc64le default y if BR2_x86_64 + default y if BR2_riscv diff --git a/package/cmake/Config.in b/package/cmake/Config.in index 3c47fdcb49..4ef5612b57 100644 --- a/package/cmake/Config.in +++ b/package/cmake/Config.in @@ -6,7 +6,7 @@ config BR2_PACKAGE_CMAKE_ARCH_SUPPORTS BR2_mipsel || BR2_mips64el || BR2_powerpc || \ BR2_powerpc64 || BR2_powerpc64le || BR2_sparc || \ BR2_i386 || BR2_x86_64 || BR2_xtensa || \ - BR2_s390x + BR2_s390x || BR2_riscv
先选用这个defconfig: make qemu_riscv64_virt_defconfig, 然后我们用make menuconfig 打开buildroot的图形配置界面,选上:
1 2 3 4 5 6 7 BR2_TOOLCHAIN_BUILDROOT_GLIBC=y BR2_USE_WCHAR=y BR2_PACKAGE_QEMU=y BR2_PACKAGE_QEMU_CUSTOM_TARGETS=riscv64-softmmu BR2_TARGET_ROOTFS_CPIO=y BR2_TARGET_ROOTFS_CPIO_GZIP=y
然后make -j编译,生成的小文件系统在buildroot/output/images下。
guest内核 guest内核可以和上面的host内核用同一个。
运行脚本 启动第一层qemu:
1 2 3 4 5 6 7 8 9 10 11 #!/bin/sh qemu-system-riscv64 \ -smp 1 -m 1024m \ -nographic \ -machine virt -cpu 'rv64,h=true' \ -kernel ~/repos/linux/arch/riscv/boot/Image \ -append "console=ttyS0 root=/dev/ram rdinit=/init" \ -initrd ~/repos/buildroot/output/images/rootfs.cpio.gz \ -device virtio-9p-pci,fsdev=p9fs,mount_tag=p9,bus=pcie.0 \ -fsdev local,id=p9fs,path=/home/sherlock/p9root,security_model=mapped
注意,qemu之前的中间版本可能使用-cpu rv64,x-h=true使能H扩展,在qemu v7.0.0以及之后 的版本都用-cpu rv64,h=true使能H扩展。
启动第二层qemu:
1 2 3 4 5 6 7 8 9 #!/bin/sh qemu-system-riscv64 \ -smp 1 -m 256m \ -nographic \ -machine virt --enable-kvm \ -kernel ./Image \ -append "console=ttyS0 root=/dev/ram rdinit=/init" \ -initrd ./rootfs.cpio.gz