1. 设备树概述:起源、作用与核心地位

1.1 设备树的起源:从“硬编码”到“数据驱动”

在早期的嵌入式 Linux 系统中,板级硬件信息(如内存基址、外设寄存器地址、中断号、时钟频率等)被直接硬编码在 C 语言源文件中,通常集中在 arch/arm/mach-xxx 目录下的 board-xxx.c 文件中。这种“硬编码”模式带来了严重问题:

  • 代码冗余:每增加一款开发板,就需要新增或修改大量板级文件。
  • 维护困难:内核版本升级时,板级代码需要同步适配,工作量巨大。
  • 厂商锁定:硬件变更必须重新编译内核,无法实现“一次编译,多处运行”。

为解决上述问题,PowerPC 架构率先引入了 Open Firmware 中的设备树概念。随后,ARM 架构在 Linux 3.x 时代正式全面采用设备树(Device Tree,DT),将硬件描述从内核源码中剥离,形成独立的 .dts 源文件。这一转变标志着嵌入式 Linux 从“硬编码”时代迈入“数据驱动”时代。

核心转变: 设备树将“硬件是什么”与“内核怎么用”彻底解耦。内核不再关心具体板级细节,只通过设备树提供的结构化数据来初始化硬件。

1.2 设备树的作用:硬件描述的标准语言

设备树本质上是一种 树形数据结构,用于描述嵌入式系统中不可枚举的硬件设备信息。其核心作用包括:

作用维度 具体说明 示例
硬件拓扑描述 定义 CPU、内存、总线、外设的层级关系 cpu@0 下挂 interrupt-controller
资源属性配置 指定寄存器地址、中断号、DMA 通道、时钟频率等 reg = <0x10000000 0x1000>
驱动匹配标识 通过 compatible 属性将设备与驱动绑定 compatible = "ti,am335x-uart"
运行时参数传递 向内核传递启动参数、mac 地址、时钟频率等 bootargs = "console=ttyO0,115200"
多板兼容支持 同一内核镜像通过不同 .dtb 文件适配不同硬件 BeagleBone Black 与 Raspberry Pi 3 共用同一内核
关键概念: 设备树是“数据”而非“代码”。它不包含任何执行逻辑,只提供结构化的硬件描述数据。内核中的驱动代码负责解析这些数据并完成硬件初始化。

1.3 设备树在嵌入式 Linux 中的核心地位

在现代嵌入式 Linux 系统中,设备树已成为 硬件与内核之间的唯一桥梁。其核心地位体现在以下三个层面:

  1. 启动流程中的关键环节:Bootloader(如 U-Boot)在启动内核前,必须将设备树二进制文件(.dtb)加载到内存中,并将地址传递给内核。内核启动早期即解析设备树,完成内存映射、中断控制器初始化、时钟树建立等基础操作。
  2. 驱动开发的标准接口:几乎所有 Linux 内核子系统(GPIO、I2C、SPI、MMC、网络、显示等)都依赖设备树来获取硬件资源信息。驱动开发者只需编写与设备树属性匹配的代码,无需关心具体板级布局。
  3. 产品级维护的基石:在量产项目中,硬件迭代(如更换 Flash 型号、调整 GPIO 引脚)只需修改 .dts 文件并重新编译 .dtb,无需重新编译内核,极大降低了维护成本。
常见误区: 设备树不是万能配置。它只描述“硬件存在什么”,不描述“硬件如何工作”。驱动逻辑、协议栈、调度策略等仍由内核代码实现。设备树不能替代驱动开发。

1.4 设备树文件体系与编译流程

设备树源文件(.dts)通过设备树编译器(dtc)编译为二进制设备树 blob(.dtb)。整个文件体系包含:

  • .dts:设备树源文件,人类可读的文本格式。
  • .dtsi:设备树包含文件,类似 C 语言的 .h 头文件,用于定义 SoC 公共部分。
  • .dtb:设备树二进制文件,内核直接解析的格式。
  • .dtbo:设备树覆盖文件,用于运行时动态修改设备树。

下面通过一张 SVG 流程图展示从 .dts 到 .dtb 的完整编译链路:

设备树编译流程 设备树编译与反编译全流程 .dts 源文件 .dtsi 包含文件 dtc 编译器 (Device Tree Compiler) .dtb 二进制 .dtbo 覆盖文件 dtc -I dtb -O dts (反编译) 反编译 .dts 编译命令示例 dtc -I dts -O dtb -o output.dtb input.dts

1.5 设备树的核心地位总结

设备树已成为嵌入式 Linux 生态中 不可替代的基础设施。无论是消费电子、工业控制、汽车电子还是物联网设备,只要运行 Linux 内核,几乎都依赖设备树来完成硬件描述。掌握设备树的编译、反编译与调试技术,是每一位嵌入式 Linux 开发者的必备技能。

学习路径提示: 本章后续内容将深入讲解 .dts 语法结构、dtc 编译器选项、.dtb 二进制格式解析以及反编译实战技巧。建议读者先建立“设备树即硬件数据库”的思维模型,再逐步深入技术细节。