跳转至

Linux 内核镜像文件认识

Hi, 今天分享关于Linux 内核镜像文件,其实在接触过编译Linux 内核都接触过几种内核文件,本章节将会总结关于几种内核文件的区别,还有各个使用的场景,我相信区别可能很多人都了解一些

1. 内核镜像文件种类

这里介绍常见的内核镜像文件有vmlinux, Image, zImage, uImage,这几种也是开发过程中接触比较多。

1.1 vmlinux

vmlinux 是内核编译后生成的一个elf格式的可执行程序,vm代表着Virtual Memory(表示Linux支持虚拟内存,因此得名vm), 内核编译后是一个原始的未经任何处理加工的原版内核elf文件。

虽然说vmlinux不会最终放在运行的设备上使用,但是对于调试分析问题却有很大帮助:

调试和分析:由于保留了调试符号,vmlinux 可以用于内核开发和调试,帮助开发人员追踪问题和分析崩溃。

系统分析:在性能分析和系统监控中,vmlinux 的信息可以帮助开发人员了解内核行为和性能瓶颈。

比如在内核运行的过程中发生了oops奔溃的问题,类似空指针的问题,就可以通过vmlinux 进行一个分析,所以在这里也有一个小技巧,在对于已经发布的内核文件,同时也对vmlinux进行备份,对后续分析可能存在帮助。

1.2 Image

Image 是一个未压缩的内核映像,通常用于直接在引导加载器中加载。

Image 是从vmlinux 经过objcopy处理后的只包含二进制数据的内核代码,为经过压缩的形式存在。

正常编译的情况下就可以得到一个这样的镜像,通常在./arch/arm64/boot/

image-20240926144949206

Image 可以直接引导,比如在内核更新时候,网络方式引导内核情况下使用。

1.3 zImage

zImage 是一个压缩的内核映像,旨在减小内核大小以适应存储限制。

在嵌入式系统或其他存储空间有限的环境中,使用 zImage 格式可以有效地减少内核所占用的存储空间,从而腾出更多的空间用于其他用途。

在压缩后的zImage 往往会添加一些部分压缩代码,这样就变成了zImage。至于压缩采用什么算法,这个一般是在内核可以进行配置的。

1.4 uImage

uImage是通过mkimage 制作而成的,用来将zImage制作成uImage,制作内核启动镜像(给zImage镜像添加64字节的头信息成uImage);主要用于引导加载程序(如 U-Boot)加载和启动 Linux 内核。

在镜像前添加头部信息,这样提供了跨平台的支持,使得不同架构的系统都能使用相同的引导程序。

查看镜像添加的头部信息如下:

image-20240928165523433

从头部信息可以看到主要包含头部魔术符,CRC,时间戳,大小,加载地址等等。

2. Linux 镜像文件的关系

关于镜像文件之间的关系,vmlinux, Image, zImage, uImage变化可以从下图得知,

image-20240928171652801

下面是一个对比vmlinuxImagezImageuImage的表格:

格式 描述 压缩 引导程序兼容性 适用场景
vmlinux 未压缩的内核映像 不兼容 调试和开发
Image 经过objcopy处理 简单引导程序 一般用途,简化的引导流程
zImage 压缩内核映像,启动时解压 兼容多种引导程序 资源受限的设备
uImage zImage基础上增加了头信息 U-Boot兼容 嵌入式系统,尤其是U-Boot环境

这个表格可以帮助你清晰地看到每种格式的特点和适用场景。

3. 总结

本章节主要对内核镜像文件进行一个认识,通过了解这些格式之间的关系与演变,开发者可以更有效地选择合适的内核镜像格式,以满足特定硬件和系统需求。对于内核镜像文件直接关系可以查看第3点的图方便理解,在内核之间的优化很多时候可能会遇到一些优化启动时间,这算是内核的另一个话题了,内核往往在满足使用场景下,越小越好,可以加快加载时间。