一、区别
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之间的地址不要导致复制时的覆盖。