linux内核相关镜像zImage、zImage、bzImage、vmlinuz、vmlinux、Image关系分析(摘自《国嵌-嵌入式Linux内核驱动进阶班实验手册》)

本文介绍了Linux内核在不同平台上的镜像文件类型,如zImage、uImage、bzImage和vmlinuz之间的关系。zImage是ARM Linux压缩映像,uImage是U-boot专用,包含了额外的头信息。bzImage(非bzip2压缩)是x86平台的大尺寸压缩内核映像。vmlinuz是可引导的压缩内核,而vmlinux是未压缩的ELF格式原始内核文件。

嵌入式系统构建之 2440 开发板内核制作,目地是让大家学会嵌入式内核的配置与编译,学习时应注意与前面 X86 平台内核制作做对比。比如,从生成的镜像上来看,在 pc 的 x86 平台下,我们生成的是 bzImage 、这里我们生成的是 uImage ,它们有什么联系?下面来讨论一下这几种镜像之间的关系:

*   zImage 与 uImage

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

*   zImage 与 bzImage

bzImage 是压缩的

是的,`zImage` 和 `uImage` 都是 Linux 系统中的**内核镜像格式**,它们确实是内核的一部分或封装形式,但用途和结构不同。这些镜像并不是裸的 `kernel.bin`,而是为了适应不同的硬件平台(尤其是嵌入式系统)和引导需求而设计的。 --- ### 回答问题: #### 1. `zImage` 是什么? - `zImage` 是一个**自解压的压缩内核镜像**,主要用于 **x86 架构早期的 Linux 启动过程** 或某些嵌入式系统。 - 它由两部分组成: - 一小段未压缩的引导代码(位于开头) - 一个被压缩(通常是 gzip 压缩)的完整内核vmlinux) > 当 bootloader 加载 `zImage` 到内存后,会先执行其头部的引导代码,该代码负责将后面的压缩内核解压到高地址内存(如 0x100000),然后跳转执行解压后的内核- 适用于:内核大小 < 512KB 的情况(传统限制,因使用 `make zImage` 编译时使用的是“老式”加载机制)。 #### 2. `uImage` 是什么? - `uImage` 是 **U-Boot(Universal Bootloader)专用的内核镜像格式**,常见于嵌入式设备(如 ARM、PowerPC 板子)。 - 它本质上是一个带有 **U-Boot 镜像头(image header)** 的 `zImage` 或 `vmlinuz`。 生成方式: ```bash mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 -n "Linux Kernel" -d zImage uImage ``` - `-A`: 架构(如 arm, powerpc) - `-O`: 操作系统(linux- `-T`: 类型(kernel) - `-C`: 压缩方式(none/gzip/bzip2) - `-a`: 载入地址(load address) - `-e`: 入口地址(entry point) - `-d`: 输入文件(如 zImage- `-n`: 镜像名称 这个命令会在原始镜像前加上一个 64 字节的 U-Boot 头部,使得 U-Boot 可以识别、校验并正确加载它。 > 所以 `uImage = U-Boot header + zImage/vmlinuz` #### 3. 几种内核镜像关系对比: | 名称 | 含义 | 是否压缩 | 是否带头部 | 主要用途 | |-----------|------|---------|------------|----------| | `vmlinux` | 编译链接后原始的 ELF 格式内核 | 否(未压缩,但包含调试信息) | 否 | 开发调试用,体积大 | | `vmlinuz` | 压缩过的 `vmlinux`(通常为 gzip) | 是 | 否 | x86 发行版常用(/boot/vmlinuz-*) | | `zImage` | 自解压的小型压缩内核(适合低内存) | 是(gzip) | 否 | 旧 x86 系统或小内存嵌入式 | | `bzImage` | “big zImage”,支持大于 512KB 的内核 | 是(gzip) | 否 | 现代 PC 使用的标准压缩内核 | | `uImage` | 添加了 U-Boot 头的 zImage/bzImage | 可选 | 是(64B header) | U-Boot 引导的嵌入式系统 | > 注:`bzImage` 并不是 BZip2 压缩!名字中的 "b" 表示 "big",仍使用 gzip 压缩。 #### 4. 为什么需要这么多格式? 因为不同平台有不同的引导限制: - PC BIOS 对初始加载空间有限制 → 使用 `zImage` / `bzImage` 实现分阶段加载; - 嵌入式系统资源受限且使用 U-Boot → 需要 `uImage` 让 U-Boot 能验证、自动加载; - 不同架构加载地址不同 → 需要明确指定 load address 和 entry point; - 安全性与完整性 → `uImage` 支持 CRC 校验,防止损坏; --- ### 示例:如何生成 uImage(基于已有的 zImage) ```bash # 假设你已经有一个 zImage mkimage -A arm -O linux -T kernel -C gzip \ -a 0x80008000 -e 0x80008000 \ -n "Linux-5.10" \ -d arch/arm/boot/zImage \ arch/arm/boot/uImage ``` 之后你可以通过 U-Boot 加载它: ```shell tftp 0x80000000 uImage bootm 0x80000000 ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值