Linux Kernel映射文件vmlinux、Image、zImage、uImage及设备树
2025-07-28
82
0
config文件
make zImage 命令默认会使用.config文件进行编译。
make menuconfig 命令默认也是打开的是.config文件
如果要使用指定的config文件
make imx_v7_defconfig
正点原子IMX6UL开发板默认的配置文件为imx_v7_defconfig
make
makemenconfig依赖:
sudo apt-get install libncurses5-dev libncursesw5-dev
Linux kernel编译后生成的IMAGE文件大概有以下几种:
- vmlinux : vmlinux是 ELF 格式的文件,是编译出来的最原始的内核文件,是未压缩的.
- Image:是使用objcopy工具取消掉vmlinux的其它信息如符号表后的文件。
- zImage:是经过gzip压缩后的Image
- uImage:是在zImage前面加了64字节的头信息(文件类型,加载位置,生成时间,大小等),用于老的uboot启动。
新的uboot已经支持了zImage,故uImage已经用的经较少了。
其中 vmlinux编译后位于根makefile目录下,其余的的位于
zzmt@zzmt:~/Desktop/kernel/arch/arm/boot$ ls
bootp compressed dts Image install.sh Makefile zImage
编译脚本:
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
make menuconfig之后会生成.config,故make all是执行的编译脚本是.config
- ARM =arm:目标CPU架构
- CROSS_COMPILE=arm-linux-gnueabihf- 交叉工具编译链
- distclean:Makefile 伪指令
内核模块
IMX6UL编译后,也包括很多内核模块。
内核模块位于嵌入式设备目录/lib/modules/4.1.15/
root@ATK-IMX6U:/lib/modules/4.1.15# ls *.ko -l
-rw-r--r-- 1 root root 13K Aug 26 2025 g_mass_storage.ko
-rw-r--r-- 1 root root 11K Aug 28 2025 g_midi.ko
-rw-r--r-- 1 root root 62K Aug 29 2025 libcomposite.ko
-rw-r--r-- 1 root root 12K Aug 28 2025 snd-seq-device.ko
-rw-r--r-- 1 root root 79K Aug 28 2025 snd-seq.ko
-rw-r--r-- 1 root root 12K Aug 28 2025 snd-seq-midi-event.ko
-rw-r--r-- 1 root root 13K Aug 28 2025 snd-seq-midi.ko
-rw-r--r-- 1 root root 22K Aug 29 2025 u_ether.ko
-rw-r--r-- 1 root root 12K Aug 29 2025 usb_f_acm.ko
-rw-r--r-- 1 root root 15K Aug 29 2025 usb_f_ecm.ko
-rw-r--r-- 1 root root 13K Aug 29 2025 usb_f_ecm_subset.ko
-rw-r--r-- 1 root root 14K Aug 29 2025 usb_f_eem.ko
-rw-r--r-- 1 root root 39K Aug 29 2025 usb_f_fs.ko
-rw-r--r-- 1 root root 19K Aug 29 2025 usb_f_hid.ko
-rw-r--r-- 1 root root 64K Aug 29 2025 usb_f_mass_storage.ko
-rw-r--r-- 1 root root 20K Aug 29 2025 usb_f_midi.ko
-rw-r--r-- 1 root root 22K Aug 29 2025 usb_f_ncm.ko
-rw-r--r-- 1 root root 9.6K Aug 29 2025 usb_f_obex.ko
-rw-r--r-- 1 root root 22K Aug 29 2025 usb_f_printer.ko
-rw-r--r-- 1 root root 28K Aug 29 2025 usb_f_rndis.ko
-rw-r--r-- 1 root root 8.5K Aug 29 2025 usb_f_serial.ko
-rw-r--r-- 1 root root 24K Sep 16 2025 usb_f_ss_lb.ko
-rw-r--r-- 1 root root 22K Sep 26 2025 usb_f_uac1.ko
-rw-r--r-- 1 root root 23K Aug 29 2025 usb_f_uac2.ko
-rw-r--r-- 1 root root 65K Aug 29 2025 usb_f_uvc.ko
-rw-r--r-- 1 root root 18K Aug 29 2025 u_serial.ko
设备树
Linux 内核编译过程中,生成 .dtb(Device Tree Blob) 文件是 ARM、RISC-V 等架构 上的常见步骤.
- x86 架构:硬件信息由 BIOS/UEFI 直接提供给内核,无需额外配置。
- ARM 等嵌入式架构:硬件差异极大,传统方式需在内核源码中硬编码每个板子的硬件信息(如寄存器地址、外设列表),使用设备树可以大大降低代码的冗余度。
| 文件/工具 | 作用 |
|---|---|
| .dts | 设备树源码(人类可读的文本文件,描述硬件布局)。 |
| .dtsi | 设备树头文件(类似 C 的 .h 文件,包含通用定义,可被多个 .dts 包含)。 |
| dtc | 设备树编译器(将 .dts 编译为 .dtb)。 |
| .dtb | 设备树二进制文件(由 Bootloader 加载并传递给内核)。 |
工作流程
- 编写
.dts/.dtsi:定义硬件信息(如 CPU 型号、内存地址、GPIO 引脚等)。 - 编译为
.dtb:使用dtc工具编译(内核编译时自动完成)。 - Bootloader 加载:如 U-Boot 将
.dtb和内核镜像一起加载到内存,并传递给内核。 - 内核解析
.dtb:初始化硬件驱动时,直接从.dtb中读取硬件信息,无需硬编码。
设备树的加载
U-Boot的环境变量中,有一个非常重要的变量叫 fdtfile 或 fdt_file。它的值就是设备树文件的文件名。
=> printenv fdt_file
fdt_file=imx6ull-14x14-emmc-4.3-480x272-c.dtb
如何检查当前内核是否使用设备树?
imx6ul
cat /proc/device-tree/model # 若存在,说明使用了设备树
Freescale i.MX6 ULL 14x14 EVK Board
RK3588S
console:/proc/asound $ cat /proc/device-tree/model
Radxa ROCK 5C
编译单个 .dts 为 .dtb
# 使用 dtc 工具(通常随内核源码提供)
dtc -I dts -O dtb -o output.dtb input.dts
反编译 .dtb 为 .dts(调试用)
dtc -I dtb -O dts -o decompiled.dts input.dtb
imx6ul设备树
eMMC类型核心板
- 编译正点原子各种显示设备的设备树,若用户没有屏,启动时默认会选择imx6ull-14x14-emmc-4.3-480x272-c.dtb加载
make imx6ull-14x14-emmc-10.1-1280x800-c.dtb make imx6ull-14x14-emmc-7-1024x600-c.dtb make imx6ull-14x14-emmc-7-800x480-c.dtb make imx6ull-14x14-emmc-4.3-800x480-c.dtb make imx6ull-14x14-emmc-4.3-480x272-c.dtb make imx6ull-14x14-emmc-hdmi.dtb make imx6ull-14x14-emmc-vga.dtb
NandFlash类型核心板
- 编译正点原子各种显示设备的设备树,若用户没有屏, 启动时默认会选择imx6ull-14x14-nand-4.3-480x272-c.dtb加载
make imx6ull-14x14-nand-10.1-1280x800-c.dtb
make imx6ull-14x14-nand-7-1024x600-c.dtb
make imx6ull-14x14-nand-7-800x480-c.dtb
make imx6ull-14x14-nand-4.3-800x480-c.dtb
make imx6ull-14x14-nand-4.3-480x272-c.dtb
make imx6ull-14x14-nand-vga.dtb
make imx6ull-14x14-nand-hdmi.dtb
ARM&Linux基础





