vmlinux、 Image, zImage、 uImage 的区别
前面几小节重点是讲 vmlinux 是如何编译出来的, vmlinux 是 ELF 格式的文件,但是在实际中我们不会使用 vmlinux,而是使用 zImage 或 uImage 这样的 Linux 内核镜像文件。那么vmlinux、 zImage、 uImage 他们之间有什么区别呢?
①、 vmlinux 是编译出来的最原始的内核文件,是未压缩的,Linux 源码编译出来的 vmlinux 差不多有 16MB
②、 Image 是 Linux 内核镜像文件,但是 Image 仅包含可执行的二进制数据。 Image 就是使用 objcopy 取消掉 vmlinux 中的一些其他信息,比如符号表什么的。但是 Image 是没有压缩过的, Image 保存在 arch/arm/boot 目录下,其大小大概在 12MB**
③、 zImage 是经过 gzip 压缩后的 Image,经过压缩以后其大小大概在 6MB 左右
④、 uImage 是老版本 uboot 专用的镜像文件, uImag 是在 zImage 前面加了一个长度为 64字节的“头”,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。但是新的 uboot 已经支持了 zImage 启动!所以已经很少用到 uImage 了,除非你用的很古老的 uboot。
使用“ make”、“ make all”、“ make zImage”这些命令就可以编译出 zImage 镜像,在arch/arm/Makefile 中有如下代码:
顶层 Makefile 代码段
310 BOOT_TARGETS = zImage Image xipImage bootpImage uImage
......
315 $(BOOT_TARGETS): vmlinux
316 $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
第 310 行,变量 BOOT_TARGETS 包含 zImage, Image, xipImage 等镜像文件。
第 315 行, BOOT_TARGETS 依赖 vmlinux,因此如果使用“make zImage”编译的 Linux 内核的话,首先肯定要先编译出 vmlinux。
第 316 行,具体的命令,比如要编译 zImage,那么命令展开以后如下所示:
@ make -f ./scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/boot/zImage
看来又是使用 scripts/Makefile.build 文件来完成 vmliux 到 zImage 的转换。
关于 Linux 顶层 Makefile 就讲解到这里,基本和 uboot 的顶层 Makefile 一样,重点在于vmlinux 的生成。最后将 vmlinux 压缩成我们最常用的 zImage 或 uImage 等文件。