Device Tree、ACPI 与硬件描述
这页讲的是:驱动想接管设备,前提不是“设备天然就会自己介绍自己”,而是系统得先知道这块硬件是什么、挂在哪、有哪些寄存器、中断和依赖。学这页的重点,是理解硬件描述不是文书工作,而是设备进入内核秩序前的基础信息层。
这块是什么
Device Tree、ACPI 与硬件描述,讲的是内核怎样在驱动真正 probe 之前,先拿到一份关于硬件拓扑、资源和依赖关系的“说明书”。有的平台更常靠 Device Tree 描述板级连线和资源,有的平台更常靠 ACPI 提供固件级枚举与配置信息,但它们共同解决的问题都是:让内核先知道自己面前到底是什么硬件。
可以把它理解成:驱动不是走进一间空屋子现猜哪里有电源插座、门铃和水管,而是先看建筑图纸,知道每根线、每个房间和每种设备的大致位置与关系。
它负责什么
描述硬件拓扑与资源
- 告诉内核设备挂在哪条总线或哪片板级结构上
- 描述寄存器范围、中断号、时钟、GPIO、电源域等资源
- 表达父子关系、依赖关系和兼容信息
- 让驱动接手前已有一份基本地图
帮助设备发现与匹配
- 让内核知道有哪些设备应该被实例化出来
- 把硬件信息转成设备对象供总线和驱动框架使用
- 帮助驱动根据兼容串或固件描述找到自己要接手的对象
- 让“匹配”不只是靠拍脑袋猜设备类型
衔接平台差异
- 不同硬件平台描述方式不一样
- 同一套驱动往往要学会从不同固件接口里取信息
- 把板级连线差异和驱动逻辑尽量拆开
- 让平台差异不至于全都硬编码进驱动里
为什么它不是“多一层配置而已”
| 如果想得太简单 | 会怎样 | 真正关键在哪 |
|---|
| 觉得驱动知道设备型号就够了 | 驱动可能不知道寄存器、中断、时钟和依赖从哪来。 | 驱动接手的不只是名字,还要接手一整套资源关系。 |
| 觉得硬件描述只是启动前静态文本 | 你会忽略它如何影响设备对象创建和 probe 条件。 | 它直接决定系统里会出现哪些设备、带什么资源。 |
| 觉得 Device Tree 和 ACPI 只是语法差异 | 容易错过它们背后的平台传统和枚举方式差别。 | 它们共同解决描述问题,但接入方式和生态习惯并不完全一样。 |
| 觉得这只是嵌入式领域的事 | 会低估很多平台固件接口对驱动行为的影响。 | 桌面、服务器、嵌入式都需要某种形式的硬件描述和枚举信息。 |
关键概念
| 概念 | 现在怎么理解 |
|---|
| Device Tree | 常见于许多 SoC/嵌入式平台的一种硬件描述思路,用来表达板级设备和资源关系。 |
| ACPI | 常见于 PC/服务器等平台的固件描述与配置接口,帮助系统枚举和管理硬件。 |
| 兼容信息 | 驱动判断“这是不是我该接手的设备”时常会看的识别线索。 |
| 资源描述 | 寄存器、中断、DMA、时钟、电源域等设备运行所需条件。 |
| 固件接口 | 内核从固件或描述数据中理解硬件世界的入口。 |
为什么重要
- 它解释了为什么很多驱动代码一开始就在“取资源、读属性、看兼容信息”。
- 很多平台移植问题,根子并不在驱动算法,而在硬件描述和资源关系没接对。
- 理解这层后,你会更容易把“设备发现”“驱动匹配”“probe 接手”串成完整流程。
- 它让你看到驱动并不是直接面对裸硬件,而是先面对一层被系统组织过的硬件视图。
常见误解
- 误解一:有了驱动源码,平台描述就不重要。实际上资源、依赖和实例化方式很多都在这里决定。
- 误解二:Device Tree 和 ACPI 只是两种写法。实际上它们背后常对应不同平台传统和固件工作方式。
- 误解三:这页讲的是“启动配置”。实际上它还深深影响设备对象创建和后续生命周期。
它不负责什么
- 它不替代驱动逻辑;它负责告诉驱动“你面对的硬件条件是什么”,不替你真正操作硬件。
- 它不等于总线匹配,但会为总线和驱动框架提供匹配与资源接手所需信息。
- 它不自动保证驱动正确,只是把平台事实更清晰地交给系统。
和其他模块的关系
| 相关模块 | 关系 |
|---|
| 总线、设备发现与驱动匹配 | 硬件描述常常决定设备如何被枚举、实例化并进入匹配路径。 |
| probe、remove 与资源清理 | probe 阶段拿到的很多资源,本源上就是从固件描述里取出来的。 |
| DMA / 中断 / 电源管理 | 这些能力常常依赖正确的资源与依赖描述,否则后面路径都立不住。 |
| sysfs / 用户可见接口 | 很多设备信息最终会通过系统对象模型暴露出来,方便观察和管理。 |
读完这页后,你应该能回答
- 为什么驱动接手设备前,系统必须先知道硬件资源和依赖?
- 为什么 Device Tree、ACPI 虽然形式不同,却都在解决“硬件先怎么被描述”的问题?
- 为什么很多驱动问题其实是平台描述、资源关系和匹配条件的问题?
后面适合继续问:为什么同一驱动常要同时兼容 Device Tree 和 ACPI?硬件描述里的“兼容信息”究竟在匹配时起什么作用?哪些资源最容易在平台描述里写错后拖累整个驱动路径?