一. 内核镜像文件 zImage
前面几篇文章重点讲
vmlinux
是如何编译出来的?
vmlinux
是
ELF
格式的文件,但是在实
际中我们不会使用
vmlinux
,而是使用
zImage
或
uImage
这样的
Linux
内核镜像文件。
本文简单说明一下 内核镜像文件 zImage的生成过程。
二. Linux内核源码的make zImage过程
使用“
make
”、“
make all
”、“
make zImage
”这些命令就可以编译出
zImage
镜像。
在 arch/arm/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 文件来完成 vmlinux 到 zImage 的转换。
关于
Linux
顶层
Makefile
就讲解到这里,基本和
uboot
的顶层
Makefile
一样,重点在于
vmlinux
的生成。最后将
vmlinux
压缩成我们最常用的
zImage
或
uImage
等文件。
三. vmlinux、Image,zImage、uImage 的区别
vmlinux、zImage、uImage 他们之间有什么区别呢?
1.
vmlinux
是编译出来的最原始的内核文件,是未压缩的,比如正点原子提供的
Linux
源
码编译出来的
vmlinux
差不多有
16MB
,如下
所示:
2. Image 是 Linux 内核镜像文件,但是 Image 仅包含可执行的二进制数据。Image 就是使用 objcopy 取消掉 vmlinux 中的一些其他信息,比如符号表什么的。但是 Image 是没有压缩过的,Image 保存在 arch/arm/boot 目录下,其大小大概在 12MB 左右,如下 所示:
3. zImage 是经过 gzip 压缩后的 Image,经过压缩以后其大小大概在 6MB 左右,如下所示:
4. uImage 是老版本 uboot 专用的镜像文件,uImag 是在 zImage 前面加了一个长度为 64字节的“头”,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。但是新的 uboot 已经支持了 zImage 启动!所以已经很少用到 uImage 了,除非你用的很古老的 uboot。