Linux 内核镜像格式与 U-Boot 启动命令

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 交接控制权时跳转的入口地址。
相关推荐
忆挽篱笙歌23 分钟前
进程控制管理
linux·运维·服务器
Escalating_xu32 分钟前
【Linux 网络编程】connect 的断线重连:用状态机写一个能恢复连接的 TCP 客户端
linux·网络·tcp/ip
Zucker n2 小时前
英语“论文”语法检查工具
linux·windows
苏宸啊2 小时前
Reactor反应堆模式
linux
骇客野人3 小时前
Linux 全套实操方案(含目录详解、文件传输、日志、文件规范、环境变量、Java 应用部署运维)
java·linux·运维
_菜鸟果果3 小时前
高德地图 JS API 2.0 在国产 Linux/ARM 电脑上渲染失败 的排查与解决
linux·开发语言·javascript
GeW3 小时前
飞行汽车交付阿联酋,真正先“起飞”的是低空数据基座——红帽Linux与数据库高可用为什么成了低空运营的隐形跑道
linux
0+1114 小时前
Linux --DNS与ICMP
linux·运维·服务器
bjxiaxueliang4 小时前
一文自建STUN:在Ubuntu上分步搭建STUN服务
linux·运维·ubuntu
高旭的旭4 小时前
图解 Android 系统架构:从 App、Framework、HAL 到 Linux 驱动
android·linux·系统架构