关注+星号公众号,不容错过精彩
作者:HywelStar
Hi, 今天分享关于Linux 内核镜像文件,其实在接触过编译Linux 内核都接触过几种内核文件,本章节将会总结关于几种内核文件的区别,还有各个使用的场景,我相信区别可能很多人都了解一些。
1. 内核镜像文件种类
vmlinux
, Image
, zImage
, uImage
,这几种也是开发过程中接触比较多。1.1 vmlinux
vm
代表着Virtual Memory(表示Linux支持虚拟内存,因此得名vm), 内核编译后是一个原始的未经任何处理加工的原版内核elf文件。vmlinux
不会最终放在运行的设备上使用,但是对于调试分析问题却有很大帮助:vmlinux
可以用于内核开发和调试,帮助开发人员追踪问题和分析崩溃。vmlinux
的信息可以帮助开发人员了解内核行为和性能瓶颈。比如在内核运行的过程中发生了oops
奔溃的问题,类似空指针的问题,就可以通过vmlinux
进行一个分析,所以在这里也有一个小技巧,在对于已经发布的内核文件,同时也对vmlinux
进行备份,对后续分析可能存在帮助。
1.2 Image
Image
是一个未压缩的内核映像,通常用于直接在引导加载器中加载。Image
是从vmlinux
经过objcopy处理后的只包含二进制数据的内核代码,为经过压缩的形式存在。正常编译的情况下就可以得到一个这样的镜像,通常在./arch/arm64/boot/
Image
可以直接引导,比如在内核更新时候,网络方式引导内核情况下使用。
1.3 zImage
zImage
是一个压缩的内核映像,旨在减小内核大小以适应存储限制。
在嵌入式系统或其他存储空间有限的环境中,使用 zImage
格式可以有效地减少内核所占用的存储空间,从而腾出更多的空间用于其他用途。
在压缩后的zImage
往往会添加一些部分压缩代码,这样就变成了zImage
。至于压缩采用什么算法,这个一般是在内核可以进行配置的。
1.4 uImage
uImage
是通过mkimage 制作而成的,用来将zImage制作成uImage,制作内核启动镜像(给zImage镜像添加64字节的头信息成uImage);主要用于引导加载程序(如 U-Boot)加载和启动 Linux 内核。
在镜像前添加头部信息,这样提供了跨平台的支持,使得不同架构的系统都能使用相同的引导程序。
查看镜像添加的头部信息如下:
从头部信息可以看到主要包含头部魔术符,CRC,时间戳,大小,加载地址等等。
2. Linux 镜像文件的关系
关于镜像文件之间的关系,vmlinux
, Image
, zImage
, uImage
变化可以从下图得知,
下面是一个对比vmlinux
、Image
、zImage
和uImage
的表格:
格式 | 描述 | 压缩 | 引导程序兼容性 | 适用场景 |
---|---|---|---|---|
vmlinux | 未压缩的内核映像 | 否 | 不兼容 | 调试和开发 |
Image | 经过objcopy | 否 | 简单引导程序 | 一般用途,简化的引导流程 |
zImage | 压缩内核映像,启动时解压 | 是 | 兼容多种引导程序 | 资源受限的设备 |
uImage | 在zImage 基础上增加了头信息 | 是 | U-Boot兼容 | 嵌入式系统,尤其是U-Boot环境 |
这个表格可以帮助你清晰地看到每种格式的特点和适用场景。
3. 总结
本章节主要对内核镜像文件进行一个认识,通过了解这些格式之间的关系与演变,开发者可以更有效地选择合适的内核镜像格式,以满足特定硬件和系统需求。对于内核镜像文件直接关系可以查看第3点的图方便理解,在内核之间的优化很多时候可能会遇到一些优化启动时间,这算是内核的另一个话题了,内核往往在满足使用场景下,越小越好,可以加快加载时间。
往期推荐