vmlinuz/vmlinuxImagezImage与uImage的区别
Posted 代二毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vmlinuz/vmlinuxImagezImage与uImage的区别相关的知识,希望对你有一定的参考价值。
前言
内核镜像和其他的镜像并没有本质上的区别,都是用同一套交叉编译工具链来生成的,内核有这么多不同类型的镜像是为了满足各种启动方式,本质上和其他镜像都是一样的,只是在此基础上做了修改。生成镜像的过程:
(1)源代码经过编译链接变成elf格式的可执行文件;
(2)elf文件经过objcopy工具,变成bin文件,bin文件就是可烧录文件;
生成各种内核镜像的过程:
(1)编译生成vmlinuz/vmlinux,就是普通的elf可执行文件,嵌入式设备一般部署时不会用这种格式的镜像,因为体积太大,并且elf格式也不能直接烧录使用;
(2)用交叉编译工具链里的objcopy,将elf格式的vmlinuz/vmlinux变成bin格式的可烧录文件,名字为Image,objcopy把几十M大的vmlinuz/vmlinux精简成了几M大小的Image,因此这个制作烧录镜像主要目的就是缩减大小,节省磁盘;
(3)实际上Image已经可以直接烧录到flash中进行执行,但是人们觉得内核还是太大了,于是对Image进行压缩,再在压缩得到的文件前端加一段解压缩代码,这样就得到了zImage;(zImage= 解压缩代码 + Image压缩得到的文件)
(4)uImage是用uboot中的mkimage工具根据zImage制作而来。uImage是专门给uboot使用的,在zImage头部添加64个字节的头,说明这个内核的版本、加载位置、生成时间、大小等信息,其0x40之后与zImage没区别。
补充:uboot都支持uImage,不一定支持zImage;现在uImage的方式被设备树的方式替代;
uImage的64字节头结构
typedef struct image_header {
uint32_t ih_magic; /* Image Header Magic Number */
uint32_t ih_hcrc; /* Image Header CRC Checksum */
uint32_t ih_time; /* Image Creation Timestamp */
uint32_t ih_size; /* Image Data Size */
uint32_t ih_load; /* Data Load Address */
uint32_t ih_ep; /* Entry Point Address */
uint32_t ih_dcrc; /* Image Data CRC Checksum */
uint8_t ih_os; /* Operating System */
uint8_t ih_arch; /* CPU architecture */
uint8_t ih_type; /* Image Type */
uint8_t ih_comp; /* Compression Type */
uint8_t ih_name[IH_NMLEN]; /* Image Name */
} image_header_t;
以上是关于vmlinuz/vmlinuxImagezImage与uImage的区别的主要内容,如果未能解决你的问题,请参考以下文章