在嵌入式 Linux 开发中,你可能听过“设备树(Device Tree,简称 DT)”这个名词,但真正弄懂它,很多人却还是一头雾水:设备树到底是什么?为什么 Linux 需要它?今天,我们就用大白话来讲清楚。

简单来说,设备树就是一份描述硬件信息的文本或数据结构,它告诉 Linux 内核“我机器上有什么硬件,以及它们是怎么连接的”。
也就是说,设备树让 Linux 内核不用每次为不同硬件重写代码,只要提供一份对应板子的设备树,内核就能识别硬件。

ARMxy 设备树接口示意图
设备树本质上是一颗树状结构,每个节点描述一种硬件或硬件功能。
节点(Node):硬件组件,比如 UART、I2C、GPIO
属性(Property):硬件信息,比如地址、中断号、时钟频率
uart0: serial@ff180000 {
compatible = "arm,pl011", "arm,primecell";
reg = <0x0 0xff180000 0x0 0x1000>;
interrupts = <0 29 4>;
status = "okay";
};
通过设备树,内核在启动时就知道 UART0 在哪儿,该用哪个驱动,中断号是多少。
设备树有两种形式:
DTS(Device Tree Source):源文件,人可读,文本格式
DTB(Device Tree Blob):编译后的二进制文件,内核在启动时加载
myboard.dts --> dtc 编译器 --> myboard.dtb --> 内核启动时加载
这里的 dtc 是 Device Tree Compiler,用来把 DTS 编译成 DTB。
设备树的作用可以总结为三点:
硬件描述与内核解耦
内核不用为每块板子改源码,只要设备树不同,内核一样可用。
驱动自动匹配
内核通过 compatible 属性自动匹配驱动,启动时就能初始化硬件。
支持多板通用
不同板子只需不同设备树,通用内核可重复使用,节省维护成本。
在嵌入式 Linux 启动流程中,Bootloader(比如 U-Boot)会把 DTB 加载到内存,然后 Linux 内核读取设备树初始化硬件。
Bootloader -> Load DTB -> Linux Kernel -> Init hardware
通过修改设备树属性,可以控制 GPIO、I2C 设备是否启用、调整中断号或地址,而不用重新编译内核。
很多芯片厂商提供 Linux SDK,里面自带标准 DTS 文件,开发者只需按板子修改即可。
of_* 接口访问。 | |
compatible 匹配设备树节点,获取资源。 | |
在实际嵌入式开发中,硬件平台的灵活性和开发便利性直接决定项目推进效率。ARMxy 系列工业计算机正是基于这一理念设计:
ARMxy 为每块板子都提供了对应的 设备树(DTS/DTB)文件,开发者无需修改内核源码,即可快速识别 CPU、内存、外设寄存器地址、中断号和时钟信息。通过设备树,Linux 内核能够自动匹配驱动、初始化外设,大幅减少开发调试时间,让开发者可以专注于业务逻辑和应用实现。

| 完整设备树 | ||
| 丰富 IO 接口 | ||
| 设备树 + IO 协同 | ||
| 多场景适用 |

往期推荐阅读
别再装系统了!Linux 镜像到底是什么?一篇讲到你怀疑人生
实测报告:RK3588,ARMxy系列BL450 跑 YOLOv8究竟有多快?
ARMxy工业AI边缘控制器软件生态全解析:一台设备完成采集、控制、AI、可视化与运维。
融合YOLO、EtherCAT与OpenPLC的智能制造边缘AI控制器