vmlinux、 Image, zImage、 uImage 的区别

Linux内核镜像:vmlinux、zImage与uImage的区别解析
本文详细介绍了Linux内核镜像文件vmlinux、zImage和uImage之间的区别。vmlinux是未经压缩的原始内核文件,Image是去掉一些辅助信息的vmlinux,而zImage是经过gzip压缩的Image。uImage则是老版本u-boot使用的带有头部信息的内核镜像,现代u-boot已主要支持zImage启动。

来自正点原子《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

vmlinux 是 ELF 格式的文件,但是在实际中我们不会使用 vmlinux,而是使用 zImage 或 uImage 这样的 Linux 内核镜像文件。那么vmlinux、 zImage、 uImage 他们之间有什么区别呢?

①、 vmlinux 是编译出来的最原始的内核文件,是未压缩的,比如正点原子提供的 Linux 源码编译出来的 vmlinux 差不多有 16MB
在这里插入图片描述

②、 Image 是 Linux 内核镜像文件,但是 Image 仅包含可执行的二进制数据。 Image 就是使用 objcopy 取消掉 vmlinux 中的一些其他信息,比如符号表什么的。但是 Image 是没有压缩过的, Image 保存在 arch/arm/boot 目录下,其大小大概在 12MB 左右
在这里插入图片描述
相比 vmlinux 的 16MB, Image 缩小到了 12MB。

③、 zImage 是经过 gzip 压缩后的 Image,经过压缩以后其大小大概在 6MB 左右
在这里插入图片描述

④、 uImage 是老版本 uboot 专用的镜像文件, uImag 是在 zImage 前面加了一个长度为 64字节的“头”,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。但是新的 uboot 已经支持了 zImage 启动!所以已经很少用到 uImage 了,除非你用的很古老的 uboot。

<think>我们正在讨论U-Boot相关的镜像格式。用户询问imageuimage区别。 根据U-Boot的知识: - "image"通常指普通的Linux内核镜像(如zImagevmlinux),没有添加U-Boot所需的头信息。 - "uimage"是U-Boot专属格式,它在普通内核镜像前面添加了一个64字节的U-Boot头(由工具mkimage生成),包含加载地址、入口地址、校验和等信息。 因此,回答应该包括: 1. 定义:imageuimage分别是什么。 2. 结构差异:重点在uimage的头部信息。 3. 使用场景:uimage用于U-Boot引导,而普通image需借助其他引导程序(如GRUB)或通过U-Boot命令手动加载。 4. 生成方法:如何通过mkimage工具将image转换为uimage。 注意:回答后必须按照规则提出3-5个相关问题,以“§§相关问题§§”为第一行,然后列出问题。 </think>### `image` 与 `uimage` 的区别详解 在嵌入式系统(特别是 U-Boot 引导流程)中,二者是不同阶段的 Linux 内核镜像格式,主要差异如下: --- #### 核心区别总结 | 特性 | `image` (原始镜像) | `uimage` (U-Boot 专用镜像) | |--------------|----------------------------------|-----------------------------------| | **定义** | 纯 Linux 内核编译输出的原始二进制文件 | 由 `mkimage` 工具添加了 **64字节头信息** 的封装镜像 | | **文件结构** | 仅包含内核代码和数据 | 头部(64字节) + 原始内核 `image` | | **校验机制** | ❌ 无校验信息 | ✅ 含 CRC32 校验和(防止传输损坏) | | **加载信息** | ❌ 无加载地址指定 | ✅ 明确包含:<br>- 加载地址(`Load Address`)<br>- 入口地址(`Entry Point`) | | **生成工具** | 编译器直接生成(如 `arm-linux-gnueabi-gcc`) | 通过 U-Boot 的 `mkimage` 工具转换生成 | | **引导依赖** | 需手动指定加载参数 | U-Boot 自动识别头部并加载 | --- ### 详细解析 #### 1. **文件头信息(关键差异)** `uimage` 的头部结构(通过 `mkimage -l uImage` 可查看): ```c struct uboot_image_header { uint32_t ih_magic; // 幻数 0x27051956(标识 uImage) uint32_t ih_hcrc; // 头部 CRC32 校验值 uint32_t ih_time; // 镜像创建时间戳 uint32_t ih_size; // 原始内核数据大小 uint32_t ih_load; // 加载到内存的地址(如 0x80008000) uint32_t ih_ep; // 内核入口地址(如 0x80008000) uint32_t ih_dcrc; // 内核数据的 CRC32 校验 uint8_t ih_os; // 操作系统类型(Linux=5) uint8_t ih_arch; // CPU 架构(ARM=2) uint8_t ih_type; // 镜像类型(内核=2) uint8_t ih_comp; // 压缩类型(gzip=1,未压缩=0) char ih_name[32]; // 镜像名称(如 "Linux Kernel") }; ``` #### 2. **典型生成流程对比** - **`image` 生成**(如 `zImage`): ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage # 输出:arch/arm/boot/zImage(原始内核镜像) ``` - **`uimage` 生成**: ```bash # 使用 mkimage 添加头信息 mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 \ -n "Linux Kernel" -d zImage uImage # 输出:uImage(U-Boot 可引导镜像) ``` #### 3. **U-Boot 引导行为差异** - 加载 `image`:需手动指定地址 ```bash # U-Boot 命令行 fatload mmc 0:1 0x82000000 zImage # 加载原始镜像到内存 bootz 0x82000000 # 手动启动(需知入口地址) ``` - 加载 `uimage`:自动化引导 ```bash fatload mmc 0:1 0x82000000 uImage # 加载 uImage bootm 0x82000000 # U-Boot 自动解析头部并跳转 ``` --- ### 使用场景建议 | 场景 | 推荐格式 | 原因 | |---------------------|-------------|--------------------------| | U-Boot 自动引导 | `uimage` | 头部信息简化启动流程 | | GRUB/LK 等引导器 | `image` | 其他引导器不识别 uImage 头 | | 内核调试 | `image` | 避免头部干扰地址定位 | | 安全敏感系统 | `uimage` | CRC 校验防止镜像篡改 | > ⚠️ 注意:`bootm` 命令仅支持 `uimage`,而 `bootz` 命令支持原始 `image`(需配合设备树)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qlexcel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值