在我的理解中,uImage 是通过在 Image 上运行 mkimage 命令得到的。
您的理解只有部分正确。一个 uImage 可以包含任何类型的文件,不限于 Linux 的 Image 文件。实际上,它不太可能是(未压缩的)Image 文件(因为这不是常规的 make 选项)。
另一方面,zImage 是压缩的 Image,它不包含负载地址和入口点(我认为,如果我错了请纠正我)。
您是错误的,zImage 包含内核的负载地址和入口点。需要加载地址才能将内核 Image 解压缩到正确的 RAM 地址。内核的入口点则需在解压后执行它。
当构建 ARM 的 Image 和 zImage 时,Makefile 使用的是:
ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
这应该翻译为物理内存起始地址+0x8000。
zImage本身(即自解压程序)是PIC,位置无关代码。zImage可以加载到RAM的任何位置,并在其第一个地址执行,即其入口点是其加载地址。
在这种情况下,为什么要使用uImage而不是zImage?
对于旧版本的U-Boot,由于Linux内核可能没有可用的bootz命令,因此没有选择。
现在可能是主观选择。
请注意,Linux内核社区对内核中支持U-Boot的支持存在一些怨气。换句话说,如果有些人能够做出决定,我认为您将无法从主线源构建uImage。
我很好奇zImage和uImage的格式是什么,请推荐一些参考资料吗?
zImage的布局基本上由其链接器规范确定。
对于ARM,请参见
arch/arm/boot/compressed/vmlinux.lds.S。
请注意,
_magic_start包含一个无意义的加载地址。这也在Vincent Sanders的
Booting ARM Linux第5节中提到。
The zImage has a magic number and some useful information near its beginning.
Table 2. Useful fields in zImage head code
Offset into zImage Value Description
0x24 0x016F2818 Magic number used to identify this is an ARM Linux zImage
0x28 start address The address the zImage starts at
0x2C end address The address the zImage ends at
The start and end offsets can be used to determine the length of the compressed image (size = end - start).
...
The start address is usually 0 as the zImage code is position independent.
请注意,ARM启动要求已被Russel King的
Documentation/arm/booting所取代。
uImage的布局只是U-Boot头加上图像文件,无论它是什么。
(希望我写的内容不会与Tom Rini写的相矛盾。)