在我的理解是把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的头加图像文件,无论可能。
(希望没有我写什么矛盾汤姆·里尼写了。)
谢谢1“A的uImage可以包含任何类型的文件,并不仅限于Linux映像文件”,你能告诉例子uImage可以包含哪个文件? 2-“你是不正确的,zImage确实包含内核的加载地址和入口点”,我说的是引导设备加载地址而不是内核加载地址,无论如何,我想我已经明白了; zImage是PIC,所以无论它在哪里加载 – Mouin
(1)头文件有一个字节,用于编码图像的类型。请参阅http://elixir.free-electrons.com/u-boot/latest/source/include/image.h#L197以获取超过三十种可能的值。 (2)zImage在偏移量0x28处包含其加载地址(但似乎没有人使用它)。 – sawdust
好的,清楚,谢谢 – Mouin