张掖北京网站建设,新闻事件,三站合一 网站建设,个人主页页面内核编译#xff08;make#xff09;之后会生成两个文件#xff0c;一个Image#xff0c;一个zImage#xff0c;其中Image为内核映像文件#xff0c;而zImage为内核的一种映像压缩文件#xff0c;Image大约为4M#xff0c;而zImage不到2M。 那么uImage又是什么的#… 内核编译make之后会生成两个文件一个Image一个zImage其中Image为内核映像文件而zImage为内核的一种映像压缩文件Image大约为4M而zImage不到2M。 那么uImage又是什么的它是uboot专用的映像文件它是在zImage之前加上一个长度为64字节的“头”说明这个内核的版本、加载位置、生成时间、大小等信息其0x40之后与zImage没区别。 64字节的头结构如下 typedef struct image_header { uint32_t ih_magic; uint32_t ih_hcrc; uint32_t ih_time; uint32_t ih_size; uint32_t ih_load; uint32_t ih_ep; uint32_t ih_dcrc; uint8_t ih_os; uint8_t ih_arch; uint8_t ih_type; uint8_t ih_comp; uint8_t ih_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是经过压缩而得到的所以其自身就有解压缩代码。