操作环境 |
---|
物理机架构:x86_64 |
物理机系统:windows7 |
VMware虚拟机架构:x86_64 |
VMware虚拟机系统:ubuntu22.04 |
qemu模拟器:qemu-system-arm |
介绍:在VMware虚拟机(ubuntu22.04)中交叉编译arm版本的u-boot2021.01-rc4、linux5.10.153、busybox1.33.0、qemu5.2.0-rc4,并使用qemu模拟启动u-boot、linux内核。 |
编译参考链接:https://blog.csdn.net/m0_46205725/article/details/117301262
执行如下命令启动linux内核和busybox文件系统
qemu-system-arm -M vexpress-a9 -m 512M -dtb vexpress-v2p-ca9.dtb -kernel zImage -nographic --append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd initrd.img
1 报第1个错大致如下:
[3.14325312]kernel panic:
can not mount ext filesystem
can not mount VFS
...
[3.15845645]kernel panic
解决方案:因为initrd.img文件是使用mkfs.ext4进行格式化,因此重新编译linux内核,并开启配置项CONFIG_EXT4_FS=y。
2 解决第1错后,又报错如下:
Kernel panic - not syncing: No working init found
解决方案:查了半天,发现initrd.img文件里没有放busybox文件系统,自然也就没有init程序。格式化initrd.img文件后挂载到/mnt,然后将busybox的文件都复制到/mnt,然后卸载。
执行如下命令启动u-boot时
qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -nographic -net nic -net nic,vlan=0 -net tap,vlan=0,ifname=tap -sd initrd.img
1 报第1个错如下:
qemu-system-arm:vlan,invalid argument.
解决方案:
参考链接https://blog.csdn.net/birencs/article/details/126666827
增加tap0虚拟网卡后,改成如下命令
qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no -sd initrd.img
在u-boot中使用bootm命令引导linux内核和dtb设备树时
2 报第2个错如下:
参考链接https://blog.csdn.net/u014426028/article/details/108221255
=> can not recovery resverve memory!
解决方案:明确内核加载地址和入口地址以及u-boot中tftp下载地址。在u-boot中使用bdinfo命令查看内存范围如下图,正好是qemu-system-arm设置的512M
因此,使用u-boot源码目录下tool/mkimage重新制作uImage,设置内核加载地址和入口地址如下图。
在u-boot中使用bootm命令引导linux内核和dtb设备树时
3 第三个问题,卡在Starting kernel… 。如下图
解决方案:参考链接https://www.jianshu.com/p/f7d5b6ad0710
在u-boot中设置变量,增加boot参数console
=>setenv bootargs 'root=/dev/mmcblk0 rw console=ttyAMA0'
流程都没毛病!神伤良久!
总结:qemu参数-sd initrd.img实际就是u-boot中的emmc设备。