uImage

linux内核经过编译后会生成一个ELF格式的可执行程序,叫vmlinux或vmlinuz,是原始的未经任何处理加工的原版内核ELF文件;嵌入式系统烧录的一般不是这个vmlinuz/vmlinux,而是要用objcopy工具制作成烧录镜像格式,经过制作加工成烧录镜像的文件就叫Image(这个制作烧录镜像主要目的就是缩减大小,节省空间)。原则上Image就可以直接被烧录到Flash上进行启动执行(类似于u-boot.bin),但是实际上并不是这样。实际上linux的大牛们觉得Image还是太大了所以对Image进行了压缩,并且在image压缩后的文件的前端附加了一部分解压缩代码,构成了一个压缩格式的镜像就叫zImage。解压的时候,通过zImage镜像头部的解压缩代码进行自解压,然后执行解压出来的内核镜像。uboot为了启动linux内核,还发明了一种内核格式叫uImage。uImage是由uboot编译生成的工具mkimage(位于uboot代码的/tools),可以将zImage加工生成uImage。这个加工过程其实就是在zImage前面加上64字节的uImage的头信息。



uImage有两种类型,Legacy-uImage和FIT-uImage ,这两个类型的格式是不一样的,因此,uboot从这两种uImage解析出kernel信息的方式也是不一样的。 

在编译uboot完后,在/tools目录下生成mkimage文件,然后copy到系统/usr/local/bin目录下,这样就可以了。然后在内核目录下运行make uImage ARM=arm CROSS_COMPILE=arm-linux-,如果成功,就会在arch/arm/boot/目录下找到uImage文件。说明编译成功

生成uImag的工具mkimage由arch/arm/boot/Makefile中的MKIMAGE定义

MKIMAGE:=$(srctree)/scripts/mkuboot.sh

mkuboot.sh的作用是去找到是否存在”mkimage”,此工具是用来生成最后的uImage。

mkuboot.sh 首先检查toolchain是否拥有mkimage (使用-z来判空),如果没有,再检查系统中是否拥有mkimage;如果没有则报错。

原文地址:https://www.cnblogs.com/god-of-death/p/10316191.html