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

Linux 内核经过编译、压缩和封装后,会形成 vmlinuxImagezImageuImageFIT 等不同镜像格式。本文简要介绍它们的区别及对应的 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 交接控制权时跳转的入口地址。
相关推荐
吴声子夜歌6 小时前
Shell脚本——流程控制:for循环
linux·运维·shell
事圆则缓6 小时前
Ubuntu 安装与配置 Samba 服务器
linux·服务器·ubuntu
GeW6 小时前
每天2小时,21天闭环计划-RHCE通关时间表全公开
linux
weixin_450813537 小时前
pdf文档转为markdown文档
linux·pdf
我的小卷呀8 小时前
Linux ip 命令底层逻辑与实战指南
linux·运维·c语言·网络协议·tcp/ip·网络安全
handler018 小时前
【Linux】ELF、链接与动态库,程序装载全解析
linux·运维·服务器·chrome·c·elf·文件
dishugj8 小时前
操作系统四大特征|软考架构师考点梳理
java·linux·服务器
Huangjin007_8 小时前
【Linux 系统篇(十九)】进程(七):深入理解虚拟地址空间:从进程地址空间到内核管理
linux·运维·服务器
YIN_尹8 小时前
【Linux系统编程】模拟实现一个最简版C语言标准IO库
linux·服务器·c语言
aningx9 小时前
使用自定义bash脚本预防oom卡死 v2
linux