2017-07-25 195 views
0

我试图了解zImage和uImage之间的区别。为什么使用uImage而不是zImage

在我的理解uImage通过运行在Imagemkimage了,结果它增加了一个U-Boot的包装(我不知道它究竟包含)包含header加负载地址和切入点和也许我不知道的“额外信息”。

在另一方面zImage是压缩Image,它不包含加载地址和入口点(我的想法,纠正我,如果我'错了),而且U-Boot的使用它可以bootz加载。

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

  • 我很好奇学习zImage和uImage的格式是否可以请您提供一些参考?

回答

1

在我的理解是把uImage通过对图像运行mkimage生成了

你的理解是只是部分正确。
A uImage可以包含任何类型的文件,并且不限于Linux 图片文件。实际上它不可能是(未压缩的)文件(因为这不是传统的使选项)。

在另一方面的zImage是压缩图像,它不包含加载地址和入口点(我的想法,纠正我,如果我'[原文]错)

你是不正确的,它包含了内核的加载地址和入口点。为了将内核映像解压到适当的RAM地址,需要加载地址。内核的入口点在解压后需要执行。
当构建用于ARM图像和的zImage中,生成文件使用

ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET) 

应翻译的物理内存+为0x8000开始。

zImage本身(即自解压程序)是PIC,与位置无关的代码。 zImage可以加载到RAM中的任何地方,并在其第一个地址执行,即它的入口点是它的加载地址。

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

对于老版本的U-Boot,没有别的选择,因为bootz命令可能没有可用于Linux内核。
时下它可能是一种主观选择。

请注意,Linux内核社区对于在内核中支持U-Boot存在一些不满。如果某些人有他们的方式,我会觉得你不能从主线源创建一个uImage

我想知道什么是zImage和uImage的格式,请问您能推荐一些参考吗?

zImage的布局本质上是由其链接器规范给出的。
有关ARM,请参阅arch/arm/boot/compressed/vmlinux.lds.S
请注意,_magic_start包含无意义的加载地址。这也在文森特·桑德斯Booting ARM Linux

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. 

说明第5部分提到然而,该ARM启动的要求已经由罗素国王Documentation/arm/Booting

一个的uImage的布局取代简直是U-Boot的头加图像文件,无论可能。

(希望没有我写什么矛盾汤姆·里尼写了。)

+0

谢谢1“A的uImage可以包含任何类型的文件,并不仅限于Linux映像文件”,你能告诉例子uImage可以包含哪个文件? 2-“你是不正确的,zImage确实包含内核的加载地址和入口点”,我说的是引导设备加载地址而不是内核加载地址,无论如何,我想我已经明白了; zImage是PIC,所以无论它在哪里加载 – Mouin

+0

(1)头文件有一个字节,用于编码图像的类型。请参阅http://elixir.free-electrons.com/u-boot/latest/source/include/image.h#L197以获取超过三十种可能的值。 (2)zImage在偏移量0x28处包含其加载地址(但似乎没有人使用它)。 – sawdust

+0

好的,清楚,谢谢 – Mouin

0

这不太对。虽然用于制作通常称为uImage的“传统”u-boot标头可以是任何东西,包括arch/arm/boot/Image下的Image,但它通常是zImage文件。这是因为历史上不支持在U-Boot中直接引导zImage,并且由于zImage不提供数据校验和,因此uImage具有可用内容的crc32。

zImage文件是一个独立的可执行文件。传统的“uImage”格式在U-Boot中没有正式记录,但可以通过阅读代码来理解。在大多数情况下,不是使用“uImage”,而是今天要使用FIT映像,它在U-Boot源文件的doc/uImage.FIT目录中有许多文档。