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

【Linux】Image、zImage与uImage的区别

1、Image

1.1 什么是 Image

  • Image 是一种未压缩的 Linux 内核镜像文件,包含了内核的所有代码、数据和必要的元信息。
  • 它是 Linux 内核在编译过程中生成的一个原始的二进制文件,未经过任何压缩或额外的封装处理。
  • 由于未压缩,Image 文件相对较大,但它不需要解压过程,加载速度较快。

1.2 内部结构

  • 头部:包含基本的内核信息(如内核版本、加载地址等),用于引导加载程序识别。
  • 内核代码:实际的 Linux 内核代码和数据段。
  • 内核数据:初始化和常驻的数据段,包括全局变量、静态变量等。

1.3 工作原理

  • 引导加载程序(如 U-Boot、GRUB 等)从存储介质(如 NAND Flash、SD 卡、硬盘等)中读取 Image 文件。
  • Image 文件加载到内存中的指定位置(通常是 RAM)。
  • 引导加载程序将控制权转交给 Image 的入口地址。
  • 内核开始执行初始化过程,设置硬件和系统环境,最终启动用户空间的操作系统。

1.4 编译生成Image

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- Image

2、zImage

2.1 什么是 zImage

  • zImage 是一种经过压缩的 Linux 内核镜像格式,它通过 gzip 压缩内核代码和数据,使文件大小大大减小。
  • zImage 也称为 “compressed kernel image”,在加载时会自解压缩到内存中然后执行。

2.2 内部结构

  • 解压缩头部:包括解压缩代码和一个简单的引导程序,用于引导和解压缩内核。
  • 压缩的内核代码和数据:使用 gzip 压缩后的内核代码和数据。
  • 尾部校验和:用于验证文件完整性。

2.3 工作原理

  • 引导加载程序(如 U-Boot 或其他加载器)从存储介质中读取 zImage 文件。
  • zImage 文件加载到内存中。
  • 解压缩头部代码运行,解压缩内核到内存中的指定位置。
  • 内核解压完成后,控制权转移到解压后的内核入口点,开始内核初始化和启动过程。

2.4 编译生成 zImage

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage

3、uImage

3.1 什么是 uImage

  • uImage 是 U-Boot 引导加载程序专用的内核镜像格式。
  • 它是在 zImageImage 的基础上加上一个 U-Boot 头部信息(U-Boot Header),使 U-Boot 能够识别并加载内核镜像。

3.2 内部结构

  • U-Boot Header:一个 64 字节的头部信息,其中头部包含的信息可看下文:【Linux】uImage头部信息详细解析-CSDN博客
  • 内核镜像:可以是 zImageImage 或其他类型的镜像。

3.3 工作原理

  • U-Boot 读取 uImage 文件。
  • U-Boot 解析头部信息,验证镜像的合法性和完整性。
  • 将内核镜像加载到指定的内存地址。
  • 如果内核镜像是压缩的,U-Boot 会解压缩它。
  • 将控制权交给内核的入口地址,启动 Linux 内核。

3.4 编译生成 uImage

mkimage -A arm -O linux -T kernel -C gzip -a 0x8000 -e 0x8000 -n "Linux Kernel" -d zImage uImage
  • -A:目标架构(ARM)。
  • -O:操作系统(Linux)。
  • -T:镜像类型(内核)。
  • -C:压缩类型(gzip)。
  • -a:加载地址(0x8000)。
  • -e:入口点地址(0x8000)。
  • -n:镜像名称("Linux Kernel")。
  • -d:源文件(zImage)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【蜡笔小新专享】安装虚拟机、PHP、DVWA
  • 三只羊的麻烦,轮到抖音了…
  • OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia
  • Android Studio Menu制作
  • GPIO子系统
  • leetcode49字母异位词分组
  • 一.Oracle每日运维操作
  • 清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程
  • Html在线编辑器
  • Markdown formula 公式
  • 【C#生态园】完整解读C#音频处理库:功能、安装配置和使用场景一网打尽
  • 2024短剧系统开发,付费短剧小程序app源码教程,分销功能讲解搭建上线
  • Java项目实战II基于Java+Spring Boot+MySQL的作业管理系统设计与实现(源码+数据库+文档)
  • 配电房监控 配电柜监测系统方案简介@卓振思众
  • unity的学习
  • 时间复杂度分析经典问题——最大子序列和
  • 2017前端实习生面试总结
  • Codepen 每日精选(2018-3-25)
  • IndexedDB
  • java多线程
  • Java知识点总结(JavaIO-打印流)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • node.js
  • Python - 闭包Closure
  • Redis 中的布隆过滤器
  • Vue2 SSR 的优化之旅
  • 分享一份非常强势的Android面试题
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 工程优化暨babel升级小记
  • 入手阿里云新服务器的部署NODE
  • 推荐一个React的管理后台框架
  • 栈实现走出迷宫(C++)
  • zabbix3.2监控linux磁盘IO
  • 交换综合实验一
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #QT(串口助手-界面)
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (接口自动化)Python3操作MySQL数据库
  • (利用IDEA+Maven)定制属于自己的jar包
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .libPaths()设置包加载目录
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 读取 JSON格式的数据
  • .net6 webapi log4net完整配置使用流程
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .net专家(张羿专栏)
  • /boot 内存空间不够