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,可以将zImage加工生成uImage。
uImage不关linux内核的事,linux内核只管生成zImage即可,然后uboot的mkimage工具再去将zImage加工生成uImage来给uboot启动。这个加工过程其实就是在zImage前面加上64字节的uImage的头信息即可。
uImage类型
- Legacy-uImage
- FIT-uImage
Legacy-uImage
在kernel镜像的基础上,加上64Byte的信息提供给uboot使用。
FIT-uImage
将kernel、dtb、ramdisk等打包到一个image file中,并且加上一些需要的属性。uboot只要获得了这个image file,就可以得到kernel、dtb、ramdisk等镜像的具体信息和内容。
两种类型uImage的思维导图如下:
总结
- 两种类型的uImage
- 从未压缩的vmlinux到uImage的大致过程
针对Legacy-uImage在后面imx6u平台上再进行。