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 交接控制权时跳转的入口地址。
相关推荐
莫浅子5 小时前
Day 4:USB 2.0 时序与带宽预算
linux·运维·网络
ly76895 小时前
Linux 从入门到实践:系统架构、常用命令、服务管理与故障排查详解
linux·运维·系统架构
小雪崩5 小时前
嵌入式学习 day27:标准IO
linux·c语言·学习
Arnold.Shen5 小时前
Dell Storage SC - 如何发送SupportAssist,并启用安全控制台
linux·安全
wunaiqiezixin6 小时前
MIT 6.S081 xv6 源码精读(Scheduling):sched、scheduler
linux·unix·os·xv6·mit6.s081
书生执笔画浮沉6 小时前
记录一个由浮点运算引起的崩溃
linux
wWYy.7 小时前
Linux怎么接受数据包
linux·网络
xx~t7 小时前
嵌入式——Linux软件编程2
linux·运维·服务器·c语言·学习方法
Shell运维手记7 小时前
Linux (挂载|rpm|yum|源码编译)
linux·运维·笔记·网络协议·bash
RisunJan8 小时前
Linux命令-vgchange(修改 LVM 卷组属性)
linux·运维·服务器