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

2024-06-03 07:20

本文主要是介绍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嵌入式产品”的技术开发人员,关注我,一起共创嵌入式联盟。

这篇关于linux 内核映像差异介绍:vmlinux、zImage、zbImage、image、uImage等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026326

相关文章

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc