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

How can I check integrity of a extracted zImage?

$ 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 -machine vexpress-a9 -cpu cortex-a7 -smp 4 -kernel vmlinuz' 黑屏

如果你从某处随机拉取一个 Arm Linux 内核(包括 Android)并尝试 运行 它在除预期启动的硬件之外的任何硬件上,预期的结果是它在启动的早期就崩溃了,无法向屏幕或串行端口输出任何内容,即黑屏,什么也没有发生。这里最可能的情况是你的图像很好而且没有损坏,它只是没有在你运行安装它的 vexpress-a9 板上 运行 构建。

万一这真的是为 vexpress-a9 构建的内核,您遇到的下一个问题是您没有通过 -dtb 选项向 QEMU 传递设备树 blob。现代 Linux 内核不会硬编码有关它们可以 运行 的电路板的所有信息,而是期望引导加载程序(在本例中为 QEMU)向它们传递一个数据文件,该文件提供有关位置的信息所有设备都用于电路板。如果你不这样做,那么结果和上面一样:内核在启动时很早就崩溃了,无法输出任何信息,所以黑屏。