ARM64平台Image与vmlinux的精确差异及QEMU启动问题咨询
ARM64 Linux内核vmlinux与Image的差异及QEMU启动问题解析
问题背景
针对ARM64平台,使用以下命令编译启用调试的默认配置最新Linux内核:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
编译后在根目录得到vmlinux文件,在arch/arm64/boot目录得到Image文件。通过QEMU测试时,启动结果存在差异:
可启动命令
qemu-system-aarch64 -semihosting -m 1024M -nographic -machine virt,gic-version=3,virtualization=on -cpu max -kernel mylinux/arch/arm64/boot/Image
无法启动命令
qemu-system-aarch64 -semihosting -m 1024M -nographic -machine virt,gic-version=3,virtualization=on -cpu max -kernel linux/vmlinux
file命令输出
$ file vmlinux vmlinux: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), statically linked, BuildID[sha1]=65799dedbc4bed593ecec1fe49d7b267, with debug_info, not stripped $ file arch/arm64/boot/Image arch/arm64/boot/Image: MS-DOS executable PE32+ executable (EFI application) Aarch64 (stripped to external PDB), for MS Windows
vmlinux与Image的精确差异
vmlinux
- 是编译过程生成的原始ELF格式内核文件,未经过任何启动包装或压缩处理
- 保留完整的调试信息和符号表(
not stripped、with debug_info),主要用于内核调试、符号分析、性能 profiling 等开发场景 - 仅包含内核核心代码,缺少硬件启动必需的引导初始化逻辑
Image
- 是经过内核镜像工具处理后的可引导镜像,因默认defconfig开启EFI支持,生成了PE32+格式的EFI应用
- 包含启动必需的引导代码:比如MMU初始化、栈设置、EFI启动协议兼容的头部信息,能被QEMU或真实硬件的EFI固件识别
- 已剥离调试符号(
stripped to external PDB),体积更小,适配启动介质的要求
QEMU能启动Image却无法启动vmlinux的原因
QEMU的-kernel参数针对ARM64 virt平台,默认需要带有引导加载逻辑的可启动镜像:
vmlinux是纯ELF格式的内核文件,缺少QEMU启动时所需的硬件初始化引导代码和平台兼容的启动头部,QEMU无法直接解析纯ELF格式的内核完成启动流程(比如初始化内存、设置异常向量表、跳转到内核入口)Image是专门为启动场景生成的镜像,包含QEMU virt平台能识别的EFI引导头部和初始化逻辑,QEMU可以直接加载并执行该镜像,完成硬件初始化后再进入内核主程序
内容的提问来源于stack exchange,提问作者Little Tree
相关产品推荐
相关产品推荐

