kernel编译生成Image zImage uImage的区别

本文介绍了嵌入式Linux内核编译后生成的各种文件类型,包括vmlinux、zImage、bzImage、uImage、vmlinuz和initrd的区别及用途,并详细解释了zImage与uImage的关系。

内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。    


 uImage是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。 

 制作uImage文件首先在uboot的/tools目录下寻找mkimage文件,把其copy到系统/usr/local/bin目录下,这样就完成制作工具。然后在内核目录下运行make uImage。

如果成功,便可以在arch/arm/boot/目录下发现uImage文件,其大小比zImage多64个字节。  也可以在kernel下生成zImage后手动执行mkimage来生成uImage,不过需要一些参数。

其实就是一个自动跟手动的区别,有了uImage头部的描述,u-boot就知道对应Image的信息,如果没有头部则需要自己手动去搞那些参数。 U-boot的U是“通用”的意思。 


zImage是ARM Linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。

换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。另外,Linux2.4内核不支持uImage,Linux2.6内核加入了很多对嵌入式系统的支持,但是uImage的生成也需要设置。 

 
几种linux内核文件的区别: 

1、vmlinux  编译出来的最原始的内核elf文件,未压缩。

2、zImage   是vmlinux经过objcopy gzip压缩后的文件, objcopy实现由vmlinux的elf文件拷贝成纯二进制数据文件。

3、bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。 

4、uImage   U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。 

5、vmlinuz  是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。 

6、initrd   是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。

      一般情况下都在生成 vmlinux 后,再对内核进行压缩成为 zImage,压缩的目录是  kernel/arch/arm/boot。


zImage由vmlinux objcopy出来的纯二进制文件以及解压缩程序组成,zImage自带了解压缩程序,大体结构如下:


<think>我们正在讨论U-Boot相关的镜像格式。用户询问imageuimage区别。 根据U-Boot的知识: - "image"通常指普通的Linux内核镜像(如zImage或vmlinux),没有添加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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值