如何检查提取的zImage的完整性?

时间:2019-11-28 19:39:04

标签: arm qemu

$ binwalk -e linux_image.img
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Android bootimg, kernel size: 6897653 bytes, kernel addr: 0x81C08000, ramdisk size: 5959520 bytes, ramdisk addr: 0x81C08000, product name: ""
2048 0x800 Linux kernel ARM boot executable zImage (little-endian)
18479 0x482F gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)
6761720 0x672CF8 device tree image (dtb)
6883304 0x6907E8 Unix path: /dev/block/platform/soc/7824900.sdhci/by-name/vendor
6899712 0x694800 gzip compressed data, maximum compression, has original file name: "rootfs.cpio", from Unix, last modified: 2019-04-06 00:42:26
9706949 0x941DC5 MySQL ISAM compressed data file Version 11

$ dd if=linux_image.img of=vmlinuz bs=1 skip=2048 count=6897653

$ file vmlinuz
vmlinuz: Linux kernel ARM boot executable zImage (little-endian)

$ dd if=vmlinuz bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' vmlinuz-3.18.66-perf | head -n 1 | cut -d ':' -f 1) | zcat | grep -a 'Linux version'
Linux version 3.18.66 (build@test) (gcc version 4.9.3 (GCC) ) #1 SMP PREEMPT Fri Apr 1 13:16:33 PDT 2018

运行'qemu-system-arm.exe-机器vexpress-a9 -cpu cortex-a7 -smp 4-内核vmlinuz'空白屏幕

1 个答案:

答案 0 :(得分:0)

如果从某个地方拉出随机的Arm Linux内核(包括Android),并尝试在打算用于引导的硬件以外的任何其他设备上运行它,则预期的结果是它在引导初期崩溃而无法将任何内容输出到屏幕或串行端口,即黑屏,什么也没有发生。这里最有可能的情况是您的图像很好并且没有损坏,只是没有在运行它的vexpress-a9板上运行而构建。

万一这确实是为vexpress-a9构建的内核,那么下一个问题是您没有通过-dtb选项将QEMU传递给设备树Blob。现代Linux内核不会对可在其上运行的板卡的所有信息进行硬编码,而是希望引导加载程序(在本例中为QEMU)将数据传递给它们,该文件提供有关板卡上所有设备的位置的信息。如果您不这样做,那么结果将与上面相同:内核在启动时很早就崩溃,而无法输出任何信息,因此出现黑屏。