我是嵌入式系统的新手,我在qemu上玩ARM。因此,我遇到了使用cpu cortex-a9从多功能表达模拟SD启动Linux内核映像的问题。
我按以下顺序准备了所有内容:首先,我使用适当的ARM工具链使用vexpress_defconfig
构建了内核。然后我用vexpress_ca9x4_defconfig
构建了u-boot。一切都很顺利。我采用的linux内核源代码是4.13版本(git最新稳定版)。 U-boot版本是2017.09-00100。然后我准备了SD图像:
dd if=/dev/zero of=sd.img bs=4096 count=4096
mkfs.vfat sd.img
mount sd.img /mnt/tmp -o loop,rw
cp kernel/arch/arm/boot/zImage /mnt/tmp
umount /mnt/tmp
接下来我尝试按如下方式运行qemu:
qemu-system-arm -machine vexpress-a9 -cpu cortex-a9 -m 128M -dtb kernel/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel uboot/u-boot -sd sd.img -nographic
U-boot加载成功并给我命令提示符。 SD真的存在并附加:
=> mmcinfo
Device: MMC
Manufacturer ID: aa
OEM: 5859
Name: QEMU!
Tran Speed: 25000000
Rd Block Len: 512
SD version 1.0
High Capacity: No
Capacity: 16 MiB
Bus Width: 1-bit
Erase Group Size: 512 Bytes
我尝试将SD中的压缩图像加载到内存中并启动它:
fatload mmc 0:0 0x4000000 zImage
一切都很好
=> fatload mmc 0:0 0x4000000 zImage
reading zImage
3378968 bytes read in 1004 ms (3.2 MiB/s)
但后来我想启动内核并收到错误:
=> bootz 0x4000000
Bad Linux ARM zImage magic!
我也试过用u-boot的mkimage
制作的U-boot图像,就像这个例子一样:
uboot/tools/mkimage -A arm -C none -O linux -T kernel -d kernel/arch/arm/boot/Image -a 0x00010000 -e 0x00010000 uImage
还会在-C gzip
和不同的加载/输入地址上尝试zImage
,但无济于事。图像被复制到sd.img
。当我fatload
图片并使用iminfo
检查时,无论我尝试哪种选项,我都会遇到错误:
=> iminfo 0x4000000
## Checking Image at 04000000 ...
Unknown image format!
我完全感到困惑,这个问题让我疯狂,而互联网上关于这个主题的信息相当稀少。请告诉我我做错了什么并重定向到正确的方向。
使用的qemu是QEMU emulator version 2.9.0
。