Linux学习笔记——Linux内核镜像格式概述
·
Linux内核镜像格式概述
什么是“镜像格式”?
在嵌入式开发、操作系统开发中,经常提到“镜像(Image)”这个词。所谓“镜像”,指的是一个可执行文件或者系统映像,它包含了某个程序、操作系统、或某个组件的完整可运行形态,包括指令、数据、头信息、符号表等等。镜像就是你最终要烧录进板子(Flash 或 eMMC 等存储器)中用来启动和运行的程序。
Linux 内核镜像格式有哪些?
从功能和使用角度,我们可以将 Linux 内核镜像格式划分为以下几类:
| 镜像名称 | 格式 | 是否压缩 | 可否直接烧录 | 是否供调试 | 是否适用于 U-Boot | 备注 |
|---|---|---|---|---|---|---|
| vmlinux | ELF | 否 | 否 | 是 | 否 | 编译生成的原始内核 |
| vmlinuz | gzip | 是 | 否 | 否 | 否 | 压缩版内核 |
| Image | 二进制 | 否 | 是 | 否 | 取决于U-Boot配置 | 标准镜像格式 |
| zImage | gzip | 是 | 是 | 否 | 有些U-Boot支持 | Image的压缩版 |
| uImage | gzip + header | 是 | 是 | 否 | 是(通用支持) | U-Boot专用格式 |
| u-boot | ELF | 否 | 否 | 是 | 否 | bootloader本体 |
| u-boot.bin | binary | 否 | 是 | 否 | 否 | 供烧录的Bootloader |
下面,我们逐一详细讲解每种格式的特点、产生过程和使用场景:
一、vmlinux —— 编译生成的原始内核(可执行ELF)
1. 定义
vmlinux是内核源代码经过编译后生成的 最原始的、完整的ELF可执行文件。- 它包含:内核指令、数据段、调试符号(Symbol Table)、节区信息等。
- 是用于内核调试的重要文件。
2. 特点
- 未压缩,体积非常大(几十MB甚至上百MB)。
- 不能用于启动或烧录。
- 可以用
readelf、nm、objdump查看其结构和符号。 vmlinux是zImage、Image、uImage的基础文件。
3. 作用
- 用于内核调试,比如使用 GDB。
- 用于生成其他可烧录格式的中间产物。
二、vmlinuz —— vmlinux 的压缩版(gzip)
1. 定义
vmlinuz是vmlinux压缩后的版本,常见于 PC 的 Linux 系统中。- 压缩算法常为
gzip,也有使用bzip2或xz。
2. 特点
- 通常位于
/boot/目录下,作为引导项之一。 - 压缩后体积显著缩小。
- 一般由
make install自动生成。
3. 使用场景
- 用于标准 PC 系统中,如 Debian、Ubuntu 的 GRUB 启动项。
- 不能用于嵌入式系统的烧录,因为其不是原生可执行镜像。
三、Image —— 标准的内核二进制镜像(未压缩)
1. 定义
Image是vmlinux去除调试符号后生成的、可用于烧录的镜像文件,格式为裸二进制文件(raw binary)。
2. 特点
- 是内核编译后,用于部署的正式版本。
- 不能直接运行于 Linux 系统下,但可以烧录到目标设备上。
3. 构建方式
通常使用以下命令生成:
$ make ARCH=arm CROSS_COMPILE=arm-linux- Image
4. 使用场景
- 直接烧录到 Flash、eMMC、iNAND 等硬件存储器中。
- 某些 U-Boot 支持直接加载 Image(需 U-Boot 配置支持)。
四、zImage —— 压缩内核镜像(gzip + 解压器)
1. 定义
zImage是对Image进行 gzip 压缩后再加上一个自解压模块的结果。
2. 特点
- 内部结构:前段为解压器(小型loader),后段为压缩后的Image。
- 加载到内存后会自动解压并跳转执行。
3. 为什么需要压缩?
- 历史原因:Image 太大,1.44MB软盘装不下。
- 嵌入式系统受存储空间限制,压缩可减小占用空间,提高传输效率。
4. 构建方式
$ make ARCH=arm CROSS_COMPILE=arm-linux- zImage
5. 使用场景
- 某些支持 zImage 的 U-Boot 可直接引导。
- 一般情况下需要进一步加工为 uImage 才能被 U-Boot 识别。
五、uImage —— U-Boot 可识别的内核镜像
1. 定义
uImage是在zImage的基础上通过mkimage工具加工得到的格式。- 加工过程:在
zImage前加上 64 字节的 U-Boot 头部信息。
2. mkimage 工具
来自 U-Boot 的工具链,作用是给镜像添加头部,使得 U-Boot 能识别。
安装方法:
$ cd u-boot/tools
$ cp mkimage /usr/local/bin/
3. 构建方式
$ make ARCH=arm CROSS_COMPILE=arm-linux- uImage
或手动:
$ mkimage -A arm -O linux -T kernel -C gzip -a 0x30008000 -e 0x30008000 -n "Linux Kernel" -d zImage uImage
参数说明:
-A:架构(arm)-O:操作系统(linux)-T:镜像类型(kernel)-C:压缩方式(gzip)-a:加载地址-e:入口地址-n:镜像名字-d:镜像数据来源(zImage)
4. 使用场景
- 几乎所有使用 U-Boot 的嵌入式系统都使用 uImage。
- 通常 U-Boot 命令:
bootm 0x30008000
六、u-boot 和 u-boot.bin 的区别
1. u-boot(ELF 格式)
- 是 U-Boot bootloader 源码编译后生成的 ELF 可执行程序。
- 可用于 Linux 系统下模拟或调试。
2. u-boot.bin(二进制格式)
- 是将 u-boot 通过
objcopy转换为 binary 格式,去掉符号表、节区信息后形成的裸镜像。 - 这是实际烧录到设备中的 bootloader。
转换命令:
arm-linux-objcopy -O binary u-boot u-boot.bin
总结与对比表
| 名称 | 类型 | 是否压缩 | 是否带符号表 | 主要用途 | 是否可烧录 | 是否可用于U-Boot启动 |
|---|---|---|---|---|---|---|
| vmlinux | ELF | 否 | 是 | 调试分析 | 否 | 否 |
| vmlinuz | gzip | 是 | 否 | PC系统引导 | 否 | 否 |
| Image | binary | 否 | 否 | 可用于烧录 | 是 | 可能支持 |
| zImage | gzip+自解压 | 是 | 否 | 节省空间,快速启动 | 是 | 部分支持 |
| uImage | zImage+头 | 是 | 否 | U-Boot标准启动格式 | 是 | 全面支持 |
| u-boot | ELF | 否 | 是 | Bootloader调试 | 否 | 否 |
| u-boot.bin | binary | 否 | 否 | 烧录到Flash | 是 | 否 |
面试实用表达(建议背诵)
-
什么是 vmlinux?
vmlinux是内核编译生成的最原始版本,包含完整的指令和数据段,但不适合直接烧录使用。
-
为什么需要 zImage?
zImage是Image的压缩版,压缩后大小更适合内存受限的嵌入式设备,且自带解压器,启动时自动解压。
-
uImage 和 u-boot.bin 的区别是什么?
uImage是 U-Boot 支持的内核镜像格式,包含自解压模块及头信息;而u-boot.bin是 Bootloader 本身的二进制镜像。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)