Linux 内核镜像与启动组件全解析:从 vmlinux 到 extlinux.conf
🧠 Linux 内核镜像与启动组件全解析:从 vmlinux 到 extlinux.conf
在嵌入式 Linux 系统中,启动流程涉及多个关键文件和机制。不同的镜像格式和配置文件承担着不同的职责,从内核编译到 bootloader 加载,再到系统启动。本文将系统梳理 vmlinux、Image、zImage、uImage、System.map、extlinux.conf 的作用、生成方式及它们之间的关系。
✅ 一、vmlinux:原始内核文件(调试专用)
📦 是什么?
vmlinux
是 Linux 内核编译完成后生成的 ELF 格式可执行文件- 包含完整的符号表、调试信息、段信息
- 不能直接用于启动系统,但是调试内核的关键文件
🔧 用途:
- GDB 调试内核
- crash 工具分析 vmcore
- 提供 System.map 符号表参考
📁 位置:
通常在内核源码根目录下生成:
./vmlinux
✅ 二、Image:可启动的内核镜像(未压缩)
📦 是什么?
Image
是从vmlinux
中提取出的纯内核代码二进制文件- 去掉了调试信息和符号表
- 可直接被 bootloader(如 U-Boot)加载并启动
🔧 用途:
- 嵌入式设备启动(如 RK3588)
- 配合 extlinux.conf 或 FIT image 使用
📁 位置:
arch/arm64/boot/Image
✅ 三、zImage:压缩内核镜像(含解压引导)
📦 是什么?
zImage
是Image
的压缩版本,附带一个 boot stub(解压引导代码)- 启动时自动解压并跳转到内核入口
🔧 用途:
- ARM 平台常用,适合空间受限设备
- 可通过
bootz
命令启动(U-Boot)
📁 位置:
arch/arm/boot/zImage
✅ 四、uImage:U-Boot 专用镜像(加头信息)
📦 是什么?
uImage
是在Image
或zImage
前加上 U-Boot 识别的头部信息- 包含加载地址、镜像大小、类型等元数据
- 使用
mkimage
工具生成
🔧 用途:
- 老版本 U-Boot 使用
uImage
加载内核 - 新版 U-Boot 已支持直接加载
Image
或zImage
📁 生成方式:
mkimage -A arm -O linux -T kernel -C none -a 0x00200000 -e 0x00200000 -n "Linux Kernel" -d Image uImage
✅ 五、System.map:符号表文件(定位地址)
📦 是什么?
System.map
是编译内核时生成的符号表文件- 记录了所有函数、变量的地址与名称
🔧 用途:
- 分析内核崩溃日志(定位 PC/LR 地址)
- 查找符号是否存在
- 配合
/proc/kallsyms
做符号对比 - crash 工具分析 vmcore(需配合 vmlinux)
📁 位置:
/boot/System.map-<kernel-version>
✅ 六、extlinux.conf:启动配置文件(U-Boot 菜单)
📦 是什么?
extlinux.conf
是 U-Boot 支持的启动配置文件- 定义启动项、内核路径、设备树路径、initrd 路径、启动参数等
🔧 用途:
- 多启动项管理
- 设置默认启动项、超时、菜单背景
- 配合
Image
使用,简化启动流程
📁 示例配置:
LABEL linux-6.1.118KERNEL /Image-6.1.118FDT /rk3588-firefly.dtbINITRD /initrd-6.1.118APPEND root=/dev/mmcblk0p7 rw console=ttyFIQ0 loglevel=8
🔗 七、它们之间的关系图解
vmlinux ──▶ System.map│├──(objcopy)──▶ Image ──▶ zImage ──▶ uImage│ │ ││ └──▶ extlinux.conf 引用└──▶ GDB / crash 工具调试