当前位置: 首页 > news >正文

linux 内核映像差异介绍:vmlinux、zImage、zbImage、image、uImage等

一、背景

Linux内核是整个Linux操作系统的核心部分,它是一个负责与硬件直接交互的软件层,并且提供多种服务和接口,让用户程序能够方便地使用硬件资源。

当我们编译自定义内核时,可以将其生成为以下内核映像之一:vmlinuxzimagebzimageimagebzImage。 了解其中的差异,可以帮忙我们更好地选择。

二、Linux内核映像

内核映像是包含内核代码和其他组件的二进制表示形式的文件。让我们看看我们拥有的各种 Linux 内核映像。

2.1 vmlinx

原始的、未压缩的 Linux 内核映像称为vmlinux。vmlinux 是未压缩且不可引导形式的内核。这是生产vmlinuz的中间步骤。它包含调试符号以及完整且未修改的内核代码。

Linux 前面的“vm”代表虚拟内存。在Linux中,我们可以使用一部分硬盘空间作为虚拟内存,因此得名“vm”。

2.2 zImage

zImage 是指一种独特的压缩内核映像文件格式。zImage是vmlinux经过gzip压缩后的文件。它解决了无法处理大型压缩内核映像的旧引导加载程序的限制。

使用称为LZ77的压缩算法压缩zimage。LZ77压缩算法优化了速度,完美平衡了压缩比和解压缩性能。LZ77 压缩创建的图像文件比 bzimage小。

2.3 bzImage

bzImage 是指 Linux 引导加载程序用于在系统引导过程中加载和初始化内核的压缩内核映像文件。引导加载程序从引导设备读取 bzImage 文件并将其解压缩到内存中。然后,它将控制权转移到解压缩的内核映像,该映像继续引导过程。

bzImage 文件是编译 Linux 内核源代码的副产品,其中包括内核的核心功能、设备驱动程序和其他重要元素。当我们编译内核时,它会生成 vmlinux。但是,vmlinux 太大,无法放入引导期间可用的有限内存(RAM 的前 640KB)。 因此,我们使用 gzip 实用程序将 vmlinux 文件压缩为较小的大小(通常压缩到 512KB 以下),从而创建 bzImage 映像文件。

压缩过程显著减小了内核映像的大小,使引导过程更容易。bzImage 中的“bz”代表“大压缩”,因为我们使用 gzip 压缩算法压缩内核映像。

2.4 image

一般编译器链接生成的文件都是一个ELF格式的可执行文件,对于内核来说也就是经过LD后生成vmlinux,然后利用OBJCOPY工具处理这个EFL文件,去除其中的符号和重定位信息等等,生成一个完全的二进制文件Image。

2.5 uImage

uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别

三、示例

以编译一个压缩后的内核镜像为例:

make bzImage -j4

最后链接过程的log如下所示:

四、总结

在本文中,我们看到了内核映像格式,它为我们提供了部署和引导 Linux 内核的不同选项。

  • vmlinux 是未压缩的内核代码

  • Image是去除其中的符号和重定位信息等等,生成一个完全的二进制文件。

  • zimage是一种较旧的压缩格式,

  • bzImage 是改进版本,uImage 则是与uboot结合的版本。

选择正确的内核映像格式取决于多种因素,例如用例、硬件架构、引导加载程序兼容性和压缩/优化要求。

参考:https://www.baeldung.com/linux/kernel-images

一个专注于“嵌入式知识分享”、“DIY嵌入式产品”的技术开发人员,关注我,一起共创嵌入式联盟。

http://www.lryc.cn/news/361223.html

相关文章:

  • 【Linux-INPUT输入的子系统】
  • 密码加密及验证
  • 找出字符串中出现最多次数的字符以及出现的次数
  • 如何看待央行买卖长期国债?
  • MATLAB算法实战应用案例精讲-【数模应用】Turf组合模型(附MATLAB、python和R语言代码实现)
  • android源码下载编译模拟器运行
  • Golang:Sirupsen/logrus是一个日志库
  • Android Studio插件开发 - Dora SDK的IDE插件
  • 【mybatis】缓存
  • 自定义类型:结构体类型
  • C++对象移动
  • “华为杯”第十三届中国研究生 数学建模竞赛-E题:粮食最低收购价政策问题研究(续)
  • (一)django目录介绍
  • leetcode5 最长回文子串
  • 《论文阅读》通过顺序不敏感的表示正则化实现稳健的个性化对话生成 ACL 2023
  • python采集汽车价格数据
  • 德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第四周) - 语言建模
  • Jitsi meet 退出房间后,用户还在房间内
  • Java 18 新特性
  • c++基础创建对象
  • WHAT - 容器化系列(二)- docker
  • 力扣 19题 删除链表的倒数第 N 个结点 记录
  • 渗透测试之Web安全系列教程(二)
  • 【算法】在?复习一下快速排序?
  • matlab安装及破解
  • Tree——输出项目的文件结构(Linux)
  • UE5 读取本地图片并转换为base64字符串
  • 【NOIP普及组】税收与补贴问题
  • Docker 部署 mysql 服务
  • 01- Redis 中的 String 数据类型和应用场景