uImage生成过程
为什么要用uImage,为什么不直接用未压缩的Image/vmlinux镜像?
嵌入式设备由于成本限制,flash容量往往十分紧张,所以在存放固件时,需要对固件进行压缩处理。
时间换空间,解压缩时花费更多的时间(增加启动时间,节省存储空间)。uImage/zImage应运而生。
编译打印
LD vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gz
AS arch/arm/boot/compressed/piggy.o
CC arch/arm/boot/compressed/misc.o
AS arch/arm/boot/compressed/head-xscale.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
编译最先链接生成的vmlinux是可引导的、可压缩的内核镜像,vm代表Virtual Memory。Linux支持虚拟内存,因而得名vm。它是由用户对内核源码编译得到,实质是elf格式的可执行文件。也就是说,vmlinux是编译出来的最原始的内核文件,未压缩,这种格式的镜像多存放在PC机上。
OBJCOPY arch/arm/boot/Image
命令,则将vmlinux去除符号,只保留二进制文件,此时的Image文件已经不是elf格式了。arm架构下,此步骤会把可执行文件拷贝到arch/arm/boot/目录下。
GZIP arch/arm/boot/compressed/piggy.gz
把Image文件压缩成piggy.gz,这里的打印是使用gzip格式压缩,内核menuconfig配置时,可以配置压缩格式。压缩比率最高的应该时lzma各式,但是相对的,设备启动自解压内核的时间也会更长。
LD arch/arm/boot/compressed/vmlinux
,这里的vmlinux是自解压可执行程序和经过压缩过后piggy.gz文件拼接而成的。arch/arm/boot/compressed/
目录下存放了自解压程序源码,会根据内核配置的压缩格式,编译对应的自解压程序,编译成的自解压程序是一个单独的可执行文件(独立于内核)。自解压程序+piggy.gz拼接成新的vmlinux镜像(elf格式)。
zImage是新的vmlinux,二进制化后形成的内核镜像文件(非elf)
uImage是在zImage基础上,使用uboot下mkimage工具,编译生成的uboot专用镜像。
在编译过程中可以留心观察一下,最终编译链接的打印,以及上文提到各个文件的大小。