为什么要使用uImage而不是zImage

Mouin:

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

以我的理解uImage是通过在mkimage运行Image而获得的,因此,它添加了一个U-Boot包装器(我不知道它确切包含了什么),该包装器包含标头,加载地址和入口点,以及可能包含的“额外信息”不知道

另一方面,它zImage是压缩的Image,它不包含加载地址和入口点(我认为,如果我错了,请纠正我),但U-Boot可以使用加载它bootz

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

  • 我很好奇要了解zImage和uImage的格式是什么,您能建议一些参考吗?

锯末 :

据我了解,uImage是通过在Image上运行mkimage获得的

您的理解只是部分正确。
的uImage可以包含任何类型的文件,并且不限制在Linux的图像文件。实际上,它不太可能是(未压缩的)映像文件(因为这不是常规的make选项)。

另一方面,zImage是压缩的Image,它不包含加载地址和入口点(我认为,如果我错了,请纠正我)

您不正确,zImage确实包含内核的加载地址和入口点。需要加载地址才能将内核映像解压缩为正确的RAM地址。解压缩后,需要内核的入口点来执行它。
在为ARM构建Image和zImage时,Makefile使用

ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)

这应该转换为物理内存的开始+ 0x8000。

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

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

对于较旧版本的U-Boot,由于bootz命令可能不适用于Linux内核,因此别无选择
如今,这可能是一个主观的选择。

请注意,Linux内核社区对内核中的U-Boot支持有些不满。IOW如果有人这样做,我会觉得您将无法从主线源构建uImage

我很想知道zImage和uImage的格式是什么,能否请您提出一些参考?

zImage的布局基本上由其链接器规范给出。
对于ARM,请参见arch / arm / boot / compressed / vmlinux.lds.S
请注意,_magic_start包含无意义的加载地址。文森特·桑德斯(Vincent Sanders)的引导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标头加上图像文件,无论可能是什么。

(希望我写的东西与汤姆·里尼写的东西不矛盾。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么要使用ClassCastException而不是编译错误?

为什么要使用Optional.of而不是Optional.ofNullable?

为什么要使用责任链而不是简单的for循环?

为什么要使用jQuery on()而不是click()

在python中,为什么要使用日志记录而不是print?

关于for(),为什么要使用i ++而不是++ i?

为什么要使用空的抽象类而不是接口?

为什么要使用指针而不是对象本身?

为什么要使用IHttpActionResult而不是HttpResponseMessage?

为什么要使用var而不是类型?

为什么要使用迭代器而不是数组索引?

为什么要使用REST而不是基于SOAP的服务?

为什么要使用Runnable而不是Thread?

为什么要使用null!=而不是任何东西!= null?

为什么要使用.toString(32)而不是.toString(36)?

为什么要使用工厂而不是“新工厂”?

为什么要使用beforeRouteEnter而不是挂载?

为什么要使用归约变量而不是原子变量?

为什么我要使用异步而不是非异步方法

为什么要使用“ int input {0};” 而不是“ int intput”;

为什么要使用移位而不是for循环?

为什么要使用非阻塞waitpid而不是阻塞等待?

为什么要使用Char而不是String?

为什么要使用fillRect而不是translation?

为什么要使用资源而不是路由?

为什么要使用block \ grid而不是for循环?

为什么要使用isinstance()而不是type()?

为什么要使用Wget而不是浏览器?

为什么 Laravel 主要使用 Facades 而不是单例?