vmlinux是未压缩带调试信息的ELF格式内核镜像,用于调试;Image是去符号的二进制可启动镜像;zImage是gzip压缩后的Image,含解压代码;uImage是在zImage前加64字节U-Boot头的专用引导映像。

编译 Linux 内核时,模块(.ko 文件)和内核镜像(如 vmlinux、zImage、uImage 等)是分开生成的,但都依赖于统一的配置(.config)和编译流程。关键在于理解“哪些编译目标对应什么产物”,以及“如何控制它们的生成方式”。
明确编译目标与产物类型
内核构建系统通过顶层 Makefile 控制不同输出:
-
vmlinux:未压缩、带调试符号的完整内核镜像,用于调试分析,不直接启动;由所有built-in.o链接生成,位于源码根目录。 -
Image:去掉调试信息的可启动二进制镜像,适用于无需压缩加载的平台(如某些 ARM bare-metal 场景)。 -
zImage:对Image进行 gzip 压缩后的可启动镜像,常见于 ARM 设备,位于arch/arm/boot/zImage。 -
uImage:在zImage前加 U-Boot 头部,专供 U-Boot 引导,需指定mkimage工具路径。 -
模块文件(
.ko):动态可加载驱动或功能模块,分散在各驱动子目录下(如drivers/net/ethernet/intel/e1000/e1000.ko),仅当对应选项设为m(module)时生成。
配置阶段决定模块与镜像内容
模块是否编译、以何种形式(内置 y 或模块 m)存在,完全由 .config 决定:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 运行
make menuconfig或make xxx_defconfig生成初始.config; - 在配置界面中,
Device Drivers → Network device support → Ethernet driver support → Intel devices → E1000 support若选M,则编译为e1000.ko;若选Y,则直接集成进vmlinux和zImage; - 修改后保存退出,确保
.config文件存在且权限正常(避免因只读导致后续编译失败)。
执行编译命令生成对应产物
根据目标平台和需求选择合适命令:
- 本地编译 x86_64 内核(默认架构):
make -j$(nproc) all—— 同时生成vmlinux、arch/x86/boot/bzImage(即 x86 的压缩镜像)、所有.ko模块; - 交叉编译 ARM 内核(如 i.MX6ULL):
make -j16 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules—— 只生成zImage和模块,不生成vmlinux(除非显式加vmlinux目标); - 仅编译模块(已有
vmlinux或zImage):make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules; - 生成设备树(DTB):
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs,结果在arch/arm/boot/dts/下。
安装模块与镜像到系统
编译完成后需将产物部署到目标位置才能生效:
- 安装模块:
sudo make modules_install ARCH=arm INSTALL_MOD_PATH=/path/to/target—— 将所有.ko复制到/lib/modules/$(KERNELRELEASE)/,INSTALL_MOD_PATH可指定根文件系统挂载点(嵌入式常用); - 安装镜像及配套文件:
sudo make install ARCH=arm INSTALL_PATH=/boot—— 把vmlinuz(即zImage或bzImage)、System.map、.config拷贝至/boot; - 验证安装:
ls /lib/modules/ | grep $(make kernelrelease)确认模块目录已建;ls /boot/vmlinuz*查看镜像是否就位。

















