Linux 内核镜像文件种类认识

文摘   2024-09-28 19:35   新加坡  

关注+星号公众号,不容错过精彩

作者:HywelStar

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 可以直接引导,比如在内核更新时候,网络方式引导内核情况下使用。

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变化可以从下图得知,

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

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

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

3. 总结

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



往期推荐



GNSS篇(五) - GPSD 编译(含交叉编译)详解

GNSS篇(四) - 整活定位模块(GPSD 使用)

GNSS 篇(三) - 定位模块与协议介绍

GNSS 篇(二) - 卫星导航定位原理

GNSS篇(一) - 定位基础知识

嵌入式C语言代码风格简述

嵌入式中优先级反转及其解决方案

模块化代码 - 实例简介


公众号目录指引

 

           
“阅读原文”一起来充电吧!


码思途远
一位码农的日常分享,专注嵌入式领域相关知识。
 最新文章