qemu是硬件模拟器,方便有些同学没得开发板想验证一些driver是否在指定板卡上可以测试,qemu就实现了该功能,选择qemu模拟器最好是选择cpu厂商指定qemu源码,这样测试结果更加逼真。本文章主要介绍如何搭建zynq平台qemu模拟器环境。
1.下载qemu源码搭建qemu环境
sudo apt-get install libslirp-dev
qemu模拟器下载:https://github.com/Xilinx/qemu
unzip qemu-master.zip
cd qemu-master/
mkdir build
cd build
../configure --target-list="arm-softmmu,aarch64-softmmu,aarch64-linux-user,arm-linux-user" --enable-slirp
make
在install目录会生成qemu启动程序qemu-arm和qemu-aarch64
如果需要指定自定义内核,请按照如下修改qemu源码,否则无法重新配置CPU主频
issue链接:https://github.com/apertus-open-source-cinema/axiom-firmware/issues/62
diff --git a/hw/misc/zynq_slcr.c b/hw/misc/zynq_slcr.c
index 7557482..3a387ec 100644
--- a/hw/misc/zynq_slcr.c
+++ b/hw/misc/zynq_slcr.c
@@ -310,7 +310,7 @@ static void zynq_slcr_reset(DeviceState *d)
s->regs[LOCKSTA] = 1;
/* 0x100 - 0x11C */
- s->regs[ARM_PLL_CTRL] = 0x0001A008;
- s->regs[ARM_PLL_CTRL] = 0x00014008;
s->regs[DDR_PLL_CTRL] = 0x0001A008;
s->regs[IO_PLL_CTRL] = 0x0001A008;
s->regs[PLL_STATUS] = 0x0000003F;
到目前为止qemu安装完成,接下来需要在准备zImage,Rootfs和DTB文件。
- 准备内核和dtb文件
方法一:可以通过去官网下载bsp包,该bsp包有最小系统,可以直接使用
方法二:通过peatalinux工具和xsa硬件描述文件生成zImage和dts,rootfs文件等,这种方法比较常见,因为xsa文件通过vivado生成,在有真实的硬件环境,开发流程可以保持一致。
通过petalinux编译生成的zImage,dtb和rootfs后,就可以启动qemu
在搭建qemu环境编译目录下执行下面命令,记得替换zImage,dtb和rootfs到自己的路径
./qemu-system-arm -M arm-generic-fdt-7series -machine linux=on -serial /dev/null -serial mon:stdio -display none -kernel /home/herok/work/kernel/kernel-source_build/arch/arm/boot/zImage -initrd /home/herok/work/qemu_rootfs/repack_ramdisk.cpio.gz -gdb tcp::9000 -dtb /home/herok/work/xc7035/images/linux/system.dtb -device loader,addr=0xf8000008,data=0xDF0D,data-len=4 -device loader,addr=0xf8000140,data=0x00500801,data-len=4 -device loader,addr=0xf800012c,data=0x1ed044d,data-len=4 -device loader,addr=0xf8000108,data=0x0001e008,data-len=4 -device loader,addr=0xF8000910,data=0xF,data-len=0x4
运行结果如下:
- 退出qemu
方法一:1. 按住ctrl + a,2. 松开 3. 按住x.
方法二:开启新的终端使用 ps -A | grep "qemu" | awk '{print $1}' |xargs kill 然后使用kill命令杀掉进程。(如果内核崩溃了就只能用这种办法)
-
petalinux自定义制作rootfs文件系统
-
mkdir qemu_rootfs
cd qemu_rootfs
mkdir ramdisk_unzip
cp ../xc7035/images/linux/rootfs.cpio.gz .
gunzip -c rootfs.cpio.gz | sh -c 'cd ramdisk_unzip/ && cpio -i'
sh -c 'cd ramdisk_unzip/ && find . |sudo cpio -H newc -o' | gzip -9 > herok_ramdisk.cpio.gz
herok_ramdisk.cpio.gz根文件系统制作完成
- qemu系统和主机如何传输文件
这个地方弄了几次没有弄好,就没去折腾,需要传输文件时,就将待传输的文件放到ramdisk_unzip文件夹下面,然后重新打包rootfs文件系统。
sh -c 'cd ramdisk_unzip/ && find . |sudo cpio -H newc -o' | gzip -9 > herok_ramdisk.cpio.gz
实际上petalinux安装时候自己也安装了qemu模拟器,但是这种方法用的偏少。
petalinux-boot --qemu --kernel #这种方式启动会使用images/linux/zImage
petalinux-boot --qemu --kernel herok_apth #直接使用herok_apth路径启动