我试图了解zImage和uImage之间的区别。
在我的理解中uImage
是通过在mkimage
上运行Image
获得的,因此它添加了一个U-Boot包装器(我不知道它包含的是什么)包含header加上加载地址和入口点以及我不知道的“额外信息”。
另一方面,zImage
是压缩的Image
,它不包含加载地址和入口点(我认为,如果我错了,请纠正我),而且还包含U- Boot可以使用bootz
加载它。
在这种情况下,为何使用uImage
代替zImage
?
我很想知道zImage的格式是什么,uImage可以提供一些参考资料吗?
答案 0 :(得分:3)
在我的理解中,通过在Image上运行mkimage获得uImage
您的理解只是部分正确 uImage 可以包含任何类型的文件,并且不限于Linux 图像文件。事实上,它不太可能是(未压缩的)图像文件(因为这不是传统的 make 选项)。
另一方面,zImage是压缩的Image,它不包含加载地址和入口点(我认为,如果我[sic]错误,请纠正我)
您不正确, zImage 确实包含内核的加载地址和入口点。需要加载地址才能将内核映像解压缩到正确的RAM地址。在解压缩后,需要内核的入口点来执行它 构建Image和zImage for ARM时,Makefile使用
ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
应该转换为物理内存的开头+ 0x8000。
zImage本身(即自提取程序)是PIC,位置无关代码。 zImage可以加载到RAM中的任何地方,并在其第一个地址执行,即其入口点是其加载地址。
在这种情况下为什么使用uImage而不是zImage?
对于旧版本的U-Boot,没有选择,因为 bootz 命令可能不适用于Linux内核。
如今它可能是一个主观的选择。
请注意,Linux内核社区对内核中U-Boot的支持存在一些不满。如果有人按照自己的方式行事,我会觉得你无法从主线来源建立 uImage 。
我[sic]很想知道zImage的格式是什么,uImage可以请一些参考资料吗?
zImage的布局基本上由其链接器规范给出 对于ARM,请参阅arch/arm/boot/compressed/vmlinux.lds.S 请注意, _magic_start 包含无意义的加载地址。 Vincent Sanders的第5部分也提到了这一点。 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.
但请注意,ARM启动要求已被Russel King的Documentation/arm/Booting
取代uImage的布局只是U-Boot标题加上图像文件,无论是什么。
(希望我写的任何内容都与Tom Rini写的内容相矛盾。)
答案 1 :(得分:1)
这不太对。虽然"遗产"用于制作通常称为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目录中有许多文档。