ARM Linux Kernel 编译结果 Image zImage uImage映像的区别

一、区别       

        ARM Linux Kernel源码使用 "make CC=***  uImage" 命令编译完成后会生成三种映像:

                1. Image  : 内核的映像文件;

                2. zImage: 内核的映像压缩文件;

                3. uImage: uboot使用的内核映像文件,在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;

二、 uImage头

        uImage头结构体如下:

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生成方法

         1. 自动生成

                 ① 拷贝uboot的/tools目录下mkimage文件到/usr/local/bin目录下;

                 ②  内核根目录下运行make CC=****** uImage。

        2. 手动生成

                 ① 内核根目录下运行make CC=******,生成zImage;

                 ② 使用mkimage制定参数生成。

四、mkimage参数

        -A ==> set architecture to 'arch'

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

        -T ==> set image type to 'type' “kernel or 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  80002000 ---- image的载入地址(hex)

        -e  80008040---- 内核的入口地址(hex)

        -n  linux-XXX --- image的名字,任意

        -d  nameXXX ---- 无头信息的image文件名,你的源内核文件

        uImageXXX ---- 加了头信息之后的image文件名,任意取

        关于-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之间的地址不要导致复制时的覆盖。

  

猜你喜欢

转载自blog.csdn.net/sean_8180/article/details/81811818