Image uImage zImage U-Boot的区别

转于:http://kmoving.blog.163.com/blog/static/20504919720123151533819/

(1)、内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。

那么uImage又是什么的?它是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。

64字节的头结构如下:

typedef struct image_header {

uint32_tih_magic;

uint32_tih_hcrc;

uint32_tih_time;

uint32_tih_size;

uint32_tih_load;

uint32_tih_ep;

uint32_tih_dcrc;

uint8_tih_os;

uint8_tih_arch;

uint8_tih_type;

uint8_tih_comp;

uint8_tih_name[IH_NMLEN];

} image_header_t;

所以,uImage和zImage都是压缩后的内核映像。而uImage是用mkimage工具根据zImage制作而来的。mkimage工具介绍如下:

u-boot里面的mkimage工具来生成uImage(u-boot源码包/tools/mkimage.c )

这里解释一下参数的意义:

-A ==> set architecture to 'arch'

-O ==> set operating system to 'os'

-T ==> set image type to 'type' “kernel或是ramdisk”

-C ==> set compression type 'comp'

-a ==> set load address to 'addr' (hex)

-e ==> set entry point to 'ep' (hex)(内核启动时在此位置查询完整的内核印象)

-n ==> set image name to 'name'

-d==> use image data from 'datafile'

-x ==> set XIP (execute in place,即不进行文件的拷贝,在当前位置执行)

对于ARM linux内核映象用法:

-A arm -------- 架构是arm
-O linux -------- 操作系统是linux
-T kernel -------- 类型是kernel
-C none/bzip/gzip -------- 压缩类型
-a 20008000 ---- image的载入地址(hex),通常为0xX00008000
-e 200080XX---- 内核的入口地址(hex),XX为0x40或者0x00
-n linux-XXX --- image的名字,任意
-d nameXXX ---- 无头信息的image文件名,你的源内核文件
uImageXXX ---- 加了头信息之后的image文件名,任意取


原来在这个-C这个参数这里不太理解,因为我觉得既然mkimage是用zImage去制作uImage,而本身zImage就是经过压缩了的,为什么这个地方还要有一个压缩了,后来想了下,觉得可能是这个工具也可以根据最原始的Image去制作uImage,所以就有了这个参数,不深究。即使将zImage经过压缩后生成uImage的话,我觉得压缩比也很小。


关于-a和-e这两个参数,具体如下:

-a和-e后面跟的分别是image的载入地址和内核的入口地址,两者可以一样,也可以不一样,依情况而定。

当-a后面指定的地址和bootm xxxx后面的地址一样时,-e后面的地址必须要比-a后面的地址多0x40,也就是映像头的大小64个字节。因为当他们地址一样时,uboot是不会搬运映像的。

当-a后面指定的地址和bootm xxxx后面的地址不一样时,uboot会将bootm xxxx地址处的映像搬运到-a指定的地址处,此时,-e和-a必须要一样,因为映像头并没有搬运过去,载入地址就是内核的入口地址。需要注意的是,因为uboot要重新搬运内核映像,所以要注意bootm xxxx的地址和-a之间的地址不要导致复制时的覆盖。


因为zImage是经过压缩而得到的,所以其自身就有解压缩代码。


参考博文:http://blog.csdn.net/sailor_8318/article/details/2773412


        原文 http://blog.sina.com.cn/pengarmy

(2)、内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。

那么uImage又是什么的?它是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。

如何生成uImage文件?首先在uboot的/tools目录下寻找mkimage文件,把其copy到系统/usr/local/bin目录下,这样就完成制作工具。然后在内核目录下运行make uImage,如果成功,便可以在arch/arm/boot/目录下发现uImage文件,其大小比 zImage多64个字节。

其实就是一个自动跟手动的区别,有了uImage头部的描述,u-boot就知道对应Image的信息,如果没有头部则需要自己手动去搞那些参数。

U-boot的U是“通用”的意思。

zImage 是ARM Linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。另外,Linux2.4内核不支持uImage,Linux2.6内核加入了很多对嵌入式系统的支持,但是uImage的生成也需要设置。

U-Boot具体解释:

Universal Boot Loader。普遍的引导程序
    是非常常用的一个引导程序,可作为主流系统的引导程序,如OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris等等,
    当然同时也支持多种常见的cpu处理器,如MIPS、 x86、ARM、NIOS、XScale等

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值