ARM&Linux基础
+ -

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 加载并传递给内核)。

工作流程

  1. 编写 .dts/.dtsi:定义硬件信息(如 CPU 型号、内存地址、GPIO 引脚等)。
  2. 编译为 .dtb:使用 dtc 工具编译(内核编译时自动完成)。
  3. Bootloader 加载:如 U-Boot 将 .dtb 和内核镜像一起加载到内存,并传递给内核。
  4. 内核解析 .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

0 篇笔记 写笔记

LINUX-PCIE驱动hello_pcie源代码
一、前言教程参考:02 实战部分 PCIE设备测试https://www.bilibili.com/video/BV1zx4y1Y7D2教程参考:03 PCIe设备驱动源码解析https://www.bilibili.com/video/BV1KT421m7Gk二、驱动编写新建hello_pcie......
PCIE驱动设备文件的创建与操作
一、前言在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动文件名字)的文件进行相应的操作即可实现对硬件的操作。二、创建设备文件PCIe设备属于字符设备,我们按如下步骤创建一个字符设备: ......
PCIE-LINUX DMA驱动编写与测试
一、前言代码参考:https://gitee.com/daalw/PCIe_Driver_Demo通过查看docs/specs/edu.txt可以知道 EDU 设备是支持DMA的https://github.com/qemu/qemu/blob/v2.7.0/docs/specs/edu.txt......
PCIE-MSI中断LINUX驱动-imt_driv.h
#ifndef __IMT_TEST__H__ #define __IMT_TEST__H__#include #include #include "linux/pci.h"#incl......
PCIE-MSI中断LINUX驱动-imt_driv.c
#include #include #include #include #include
all: make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules#make -C $(KDIR) M=$(PWD) modulesclean: make -C /lib/modules/$(shell una......
#include #include #include ///<支持的ioctrl 命令#define GDMA_TEST_IOC_SUBMIT _IOW('p', ......
#include #include #include #include #include "gdma_app.h"#include <......
已经有了字符驱动的源代码,并且准备在 PC 的 Ubuntu 22.04 上编译。下面详细说明除了指定 Linux 源代码路径外,还需要做哪些环境配置和注意事项,确保你能顺利编译出内核模块(驱动)。1. 内核源码的选择与准备推荐使用与你当前运行内核版本一致的内核源码或头文件,否则编译出的模块可......
GCC ARM Linux GNUEABIHF 工具链详细介绍gcc-arm-linux-gnueabihf 是一个针对 ARM 架构的交叉编译工具链,专门用于在 x86/x86_64 主机上开发运行在 ARM Linux 系统上的应用程序。这个工具链名称中的各部分含义如下:gcc: GNU C......
config文件make zImage 命令默认会使用.config文件进行编译。make menuconfig 命令默认也是打开的是.config文件如果要使用指定的config文件make imx_v7_defconfig正点原子IMX6UL开发板默认的配置文件为imx_v7_defco......
工具下载ubuntu镜像 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/交叉工具链的下载 https://snapshots.linaro.org/gnu-toolchain/安装软件sudo apt-get install net-t......
驱动安装&卸载驱动的安装一般使用insmod,modprobe,卸载会使用rmmodinsmod命令只会安装该驱动模块,如果该驱动模块存在别的模块依赖,而刚好系统没有安装依赖模块,该驱动模块会安装失败。modproebe命令会从/lib/modules/
原子操作windowsLONG InterlockedIncrement(IN PLONG Addend);LONG InterlockedDecrement(IN PLONG Addend);Linuxatomic_t v = ATOMIC_INIT(0); /* 定义并初始化原子变零......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!