为什么使用uImage而不是zImage

7

我正在尝试了解zImage和uImage之间的区别。

据我的理解,uImage是通过在Image上运行mkimage得到的,结果它添加了一个U-Boot包装器(我不知道它具体包含什么),其中包含一个头文件以及加载地址、入口点和可能还有我不知道的“额外信息”。

另一方面,zImage是压缩的Image,它不包含加载地址和入口点(如果我理解有误,请指出),但同样可以使用bootz来加载它。

  • 在这种情况下,为什么要使用uImage而不是zImage

  • 我很想了解zImage和uImage的格式,你能推荐一些参考资料吗?

2个回答

6
在我的理解中,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写的相矛盾。)

谢谢,1-“uImage可以包含任何类型的文件,并不限于Linux镜像文件”,您能否举个例子说明uImage可以包含哪些文件?2-“你错了,zImage确实包含内核的加载地址和入口点”,我说的是启动设备的加载地址而不是内核的加载地址,不管怎样我想我已经明白了;zImage是PIC,所以无论它被加载到哪里都没有关系。 - Mouin
(1)头部有一个字节来编码图像的类型。请参阅 http://elixir.free-electrons.com/u-boot/latest/source/include/image.h#L197 了解30多个可能的值。(2)zImage在偏移量0x28处包含其加载地址(但似乎没有人使用它)。 - sawdust
我想请问一下,这是否意味着:zImage的加载地址=zImage入口点=(物理地址起始位置+0x8000)? - ransh
@ransh -- 不,你把 zImageImage 混淆了。 zImage 是位置无关的,这意味着它可以加载到它适合的任何地方,然后在其第一个地址上执行。 - sawdust

3
这并不完全正确。尽管用于创建通常称为uImage的“传统”u-boot头可以是任何内容,包括在arch/arm/boot/Image下找到的Image文件,但它通常是zImage文件。这是因为历史上,U-Boot没有直接引导zImage的支持,并且由于zImage在数据上没有提供校验和,所以uImage具有可用内容的crc32。
zImage文件是一个独立的可执行文件。传统的“uImage”格式在U-Boot中没有正式文档,但可以通过阅读代码来理解。在大多数情况下,今天您可能希望使用FIT映像,它在U-Boot源码的doc/uImage.FIT目录中有许多文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接