vmlinuz/vmlinux、Image、zImage与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;

猜你喜欢

转载自blog.csdn.net/weixin_42031299/article/details/121069903
今日推荐