打开网易新闻 查看精彩图片

2026年Google Summer of Code(谷歌编程之夏)开放申请当天,一个冷门项目"DT Bindings"的申请者突然暴增。这个项目不产App、不做前端,只干一件事:把描述硬件的文本文件从人类能读,改成机器能读。

听起来像档案数字化?错了。这关系到每年出货的数十亿颗ARM、RISC-V芯片能不能正常启动。申请者里有人为了修自己笔记本的低功耗bug,一路追查到这,才发现自己用了十年的电脑,启动时居然在"盲猜"硬件配置。

硬件世界的身份证系统

CPU启动时需要知道一件事:主板上插了什么。这个需求在PC时代被Intel和微软用ACPI表(高级配置与电源接口)解决了——你的Windows笔记本能自动识别电池、风扇、USB口,靠的就是这套x86世界的"标准简历格式"。

但嵌入式世界没这么幸运。ARM32时代,工程师得直接改操作系统或引导程序来硬编码硬件信息。每出一款新开发板,Linux内核就要打一批补丁。Krste Asanović在RISC-V早期文档里吐槽过:ARM生态的碎片化,一半要怪这种"手工作坊"式的硬件描述。

Device Tree(设备树)就是这时候被请进场的。它是一套树形数据结构,用.dts文件写人类可读的硬件描述,经dtc(设备树编译器)转成二进制的.dtb,塞给引导程序或直接喂给内核。ARM、RISC-V、MIPS这些嵌入式架构现在全靠它启动。

问题是:怎么确保这份"简历"没造假?

从TXT到YAML:一场迟到的标准化

从TXT到YAML:一场迟到的标准化

传统做法是写TXT文档。开发者手写"本设备支持I2C,地址0x11",放在内核源码的Documentation目录里。这套流程的问题很直白:机器读不懂,验证靠人工,文档还经常缺页。

DT Bindings(设备树绑定)就是给这些描述定规矩的。它规定温度传感器必须填哪些字段、地址格式是几位、可选参数有哪些。2020年后,社区强制要求新绑定用YAML重写——不是图新鲜,是老办法实在撑不住了。

YAML绑定的核心价值在于可验证。内核构建时,dtc会拿实际的设备树去套YAML里的规则,不匹配直接报错。Krzysztof Kozlowski——Linux内核设备树维护者之一——过去三年提交了超过400个转换补丁,把散落的TXT文档逐个"翻译"成机器可读的Schema。

他的工作流很能说明问题:找到一个遗留的TXT绑定,分析它隐含的规则,写成YAML Schema,再补全之前没写清楚的约束条件。一个典型的补丁可能要改五六个文件,但能让后续所有使用该硬件的开发者少踩十几个坑。

I2C和SPI的地址谜题

设备树里最让新手困惑的字段可能是reg。同样叫"寄存器",它在不同总线上完全是两回事。

I2C是地址总线。每个芯片出厂时硬编码了7位或10位地址,reg填的就是这个值。比如reg=<0x11>,CPU发数据时会在总线上广播这个地址,对应芯片抬头认领。一条I2C总线可以挂上百个设备,靠地址区分。

SPI没有地址。它用片选线(Chip Select)点对点连接,有几根线就能挂几个设备。reg在这里表示连到了第几根线:reg=<0>就是CS0,reg=<1>就是CS1。CPU想跟谁通信,就拉低对应的片选线,其他设备自动无视总线上的数据。

内存映射设备更复杂。显示控制器可能在地址A放配置寄存器,地址B放帧缓冲区——同一块芯片,两个功能,reg就要写两个条目。YAML绑定里的maxItems字段就是管这个的:它告诉验证器,这个设备的reg数组最多允许多长。

一个补丁的解剖

一个补丁的解剖

Google Summer of Code 2026的参考补丁,正是Krzysztof Kozlowski提交的一个典型转换。原TXT文档描述某温度传感器,提到"仅支持I2C",但没写地址格式、没限定取值范围、没说明可选属性。

转成YAML后,文件结构变成:顶部metadata(维护者、许可证、版本),中间properties列表(每个字段的名称、类型、约束),底部required数组(哪些字段必须填)。验证器现在能自动检查:地址是不是0x00到0x7F之间的整数、温度单位有没有写错、可选的警报阈值有没有越界。

这种转换的工程量被严重低估。Linux内核目前有约2000个设备树绑定,2024年底YAML化比例刚过60%。剩下的很多是遗留硬件,文档不全、硬件已停产、维护者失联——每推进一个都要考古。

申请者里有人算过:按当前速度,全部转换要到2028年。但新硬件还在源源不断进来,RISC-V生态爆发又让设备树的使用量翻倍。这是一场没有终点的迁徙。

为什么Google要投钱做这件事

GSoC项目的选择标准很现实:必须是上游社区真正需要、但人力不足的工作。DT Bindings符合两条:技术债务沉重,且直接影响Android生态——Google的Pixel手机、Chromebook、Nest设备,底层全是设备树。

更深层的动机可能是RISC-V。这个开源指令集架构没有x86的ACPI遗产,设备树是它唯一靠谱的启动方案。Google在RISC-V国际基金会里投了不少资源,把设备树工具链打磨顺滑,等于给未来的RISC-V Android设备铺路基。

申请者背景也很有意思:既有嵌入式工程师想系统学习内核机制,也有学生单纯被"用代码描述物理世界"这个概念吸引。一位2024年的参与者后来去了SiFive,参与的工作正是RISC-V主板的设备树标准化。

从Bug追踪到社区贡献

从Bug追踪到社区贡献

文章开头提到的笔记本低功耗bug,追查路径很典型:用户发现待机耗电异常→怀疑电源管理→查ACPI表→发现ARM64平台ACPI支持不完善→转向设备树→发现绑定文档缺失→最终定位到某个温度传感器的描述错误。

这个链条的每一步都需要人可读、机器可验证的硬件描述。TXT时代,最后一步可能要翻邮件列表找三年前的讨论;YAML时代,构建系统直接告诉你哪行违反了哪条规则。

Krzysztof Kozlowski在2025年的一次内核峰会演讲里说:「我们不是在写文档,是在写合同。硬件厂商和操作系统之间的合同。」违约的成本是内核崩溃、设备变砖、安全漏洞——而YAML验证器就是那个自动执行的法务部。

那位为GSoC申请自学设备树的开发者,后来真的提交了一个补丁:把某个音频编解码器的TXT绑定转成YAML。补丁被合并时,他在博客写:「花了两周理解为什么reg在SPI上是线号而不是地址,然后改文件只花了两小时。」

这种学习曲线正是社区想要的效果。DT Bindings项目的目的从来不是批量生产补丁,而是培养能长期维护这套基础设施的人。毕竟,新芯片还在以每年数千款的速度诞生,每一款都需要一份诚实的"简历"。

你的下一台设备——无论是手机、路由器还是智能手表——启动时都会加载一个.dtb文件。里面有多少字段通过了YAML验证,决定了它会不会在某个深夜突然睡死过去。而验证规则本身,正由一群申请者边学边写,一行一行地补全。