🧠 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 工具調試