Linux 内核经过编译、压缩和封装后,会形成 vmlinux、Image、zImage、uImage、FIT 等不同镜像格式。本文简要介绍它们的区别及对应的 U-Boot 启动命令。
从内核源码到镜像
text
vmlinux ELF 格式,通常包含符号和调试信息
│ 转为裸二进制
▼
Image 裸内核二进制,通常未压缩
├─ 压缩内核 + 自解压启动代码 ──► zImage
└─ 仅压缩内核数据 ────────────► Image.gz / Image.lzma / Image.lz4
上述内核镜像均可作为 payload,按启动方案进一步封装:
Image / zImage / 压缩后的 Image
├─ 添加 U-Boot legacy header ─► uImage
└─ 与 DTB、initramfs 等打包 ──► *.itb(FIT)
这里需要区分"内核镜像生成"和"启动镜像封装":zImage 自身包含解压代码,而 Image.gz 等文件通常只是压缩后的内核数据;uImage 和 FIT 则是外层封装,其 payload 可以是未压缩、已压缩或可自解压的内核镜像。因此,上图表示的是常见关系,而不是唯一且必须逐步执行的流水线。实际产物取决于 CPU 架构、内核配置、U-Boot 版本和产品打包脚本。
常见内核文件
| 镜像类型/格式 | 是什么 | 头部/封装信息 | 常见启动命令 |
|---|---|---|---|
vmlinux |
Linux 内核 ELF 文件,通常保留符号和调试信息 | ELF 格式 | 通常用于调试,不能直接用 bootm 启动 |
Image |
去掉 ELF 外层信息后的裸内核二进制,通常未压缩 | 无额外镜像头 | ARM64 常用 booti |
zImage |
带自解压启动代码的压缩 Linux 内核镜像 | 内含内核启动/解压代码,无 U-Boot legacy header | bootz |
uImage |
在某个内核 payload 外加 U-Boot legacy header | U-Boot legacy header | bootm |
uImage.gz |
通常表示 gzip 压缩 payload + U-Boot 头 | U-Boot legacy header | bootm |
uImage.lzma |
通常表示 LZMA 压缩 payload + U-Boot 头 | U-Boot legacy header | bootm |
FIT |
FIT 容器,可包含内核、DTB、initramfs 和多个启动配置;生成的文件通常以 .itb 结尾 |
FIT header | bootm <地址>#配置 |
压缩与封装
镜像制作通常涉及压缩和封装两个步骤:
常见压缩算法包括:
text
gzip、LZMA、LZO、LZ4
常见封装形式包括:
text
U-Boot legacy header、FIT、产品自定义分区头
uImage 表示带有 U-Boot legacy header 的镜像封装格式,但不代表内部 payload 一定是未压缩的。它可以封装未压缩的 Image、带自解压启动代码的 zImage,也可以封装经过 gzip/LZMA 等方式压缩后的 payload:
text
uImage
├─ U-Boot legacy header
└─ payload
├─ Image
├─ zImage
└─ gzip/LZMA 等方式压缩后的 Image
因此,uImage 本身只说明采用了 U-Boot legacy image 格式,并不能仅凭文件名判断 payload 是否经过压缩。实际的压缩方式应以构建流程以及镜像头中的相关信息为准。
内核镜像格式与 U-Boot 启动命令
不同内核镜像格式需要匹配对应的 U-Boot 启动命令:
text
zImage ──► bootz
Image ──► booti
uImage / FIT ──► bootm
不加 legacy U-Boot 头并不意味着一定无法启动;只要 U-Boot 使用的启动命令与镜像格式匹配即可。
镜像头信息示例
执行:
bash
dumpimage -l uImage
可能看到类似输出:
text
Image Name: linux-5.10
Created: Mon Aug 19 10:20:30 2026
Image Type: ARM Linux Kernel Image (gzip compressed)
Data Size: 5242880 Bytes = 5120.00 KiB
Load Address: 0x80008000
Entry Point: 0x80008000
其中:
Image Type:显示镜像类型和压缩方式;ARM Linux Kernel Image表示 legacy U-Boot 内核镜像,gzip compressed表示 payload 使用 gzip 压缩;Data Size:U-Boot 头后面实际内核数据的大小,不包括 64 字节 legacy header;Load Address:内核加载到内存的地址;Entry Point:U-Boot 交接控制权时跳转的入口地址。