设备树入门:DTS / DTC / DTB 关系与核心作用
设备树入门DTS / DTC / DTB 关系与核心作用作者黒漂技术佬 | 系列Linux内核配置与移植引言如果你是从单片机STM32、ESP32转到嵌入式 Linux 的第一次看到设备树Device Tree可能会觉得这是一门玄学——一个文本文件写着一些奇怪的语法编译成一个二进制文件传给内核硬件就能工作了。没有寄存器地址没有#define甚至没有一个main函数凭啥本文就从零讲清楚设备树是什么、为什么要有它、以及 DTS / DTC / DTB 三兄弟是怎么配合工作的。一、为什么需要设备树1.1 没有设备树之前——板级代码的噩梦在设备树出现之前Linux 2.6 时代ARM 平台的硬件信息是硬编码在内核arch/arm/mach-xxx/中的。每增加一块新板子就得写几百上千行板级支持代码// arch/arm/mach-xxx/board-xxx.c —— 老时代的做法staticstructresourceuart_resources[]{[0]{.start0x40002000,// 寄存器基地址写死在代码里.end0x40002FFF,.flagsIORESOURCE_MEM,},// ... 几十行平台设备定义};staticstructplatform_deviceuart_device{.nameserial8250,.id0,.num_resourcesARRAY_SIZE(uart_resources),.resourceuart_resources,};这种方式的痛点内核臃肿每种板子一套代码ARM 内核中板级代码一度达到数十万行不通用换个外设就得改内核、重新编译——哪怕只换了 GPIO 引脚难维护硬件信息散落在 C 代码中和驱动逻辑混在一起Linus 本人对此非常不满2011 年曾在邮件列表里怒斥 ARM 社区的板级代码是一坨垃圾原文更劲爆。此后 ARM 社区全面转向设备树。1.2 设备树的解决思路核心思想把硬件描述从内核代码中分离出来。[老时代] 内核代码 驱动逻辑 硬件信息 → 改了硬件就得改内核 [设备树时代] 内核代码 驱动逻辑 → 不变 DTB文件 硬件信息 → 随板子变化设备树本质上是一棵描述硬件的树状数据结构它告诉内核有哪些外设UART、GPIO、I2C、SPI 等这些外设的寄存器地址是多少用哪个引脚、哪个中断号和哪个驱动绑定二、DTS / DTC / DTB 三兄弟关系设备树涉及到三种文件/工具新手最容易混淆的就是它们之间的关系DTS源文件 DTC编译器 DTB二进制 ↓ ↓ ↓ .dts / .dtsi ────→ dtc ──────→ .dtb (文本格式) (编译工具) (二进制) (人读写) (软件) (内核读取)名词全称格式谁用说明DTSDevice Tree Source文本开发者编写类似 C 源码描述硬件配置DTSIDevice Tree Source Include文本被 DTS include类似 C 头文件SoC 级公共描述DTCDevice Tree Compiler可执行工具编译过程自动调用将 DTS/DTSI 编译成 DTBDTBDevice Tree Blob二进制U-Boot 加载给内核内核运行时解析的实际文件转换命令# 从 DTS 编译 DTB通常 make dtbs 自动完成scripts/dtc/dtc-Idts-Odtb-ooutput.dtb input.dts# 从 DTB 反编译回 DTS调试用scripts/dtc/dtc-Idtb-Odts-ooutput.dts input.dtb三、DTS 文件结构初探打开一个典型的.dts文件以versatile-pb.dts为例/dts-v1/; #include versatile-ab.dts / { model ARM Versatile PB; compatible arm,versatile-pb; memory { reg 0x00000000 0x08000000; /* 128MB RAM */ }; chosen { bootargs consolettyAMA0,115200; }; /* 引用 AB 文件中定义的节点并追加属性 */ amba { uart101f1000 { status okay; }; }; };DTS 的树状结构用树形图表达/ (根节点) ├── model ARM Versatile PB ├── compatible arm,versatile-pb ├── memory0 │ └── reg 0x00000000 0x08000000 ├── chosen │ └── bootargs consolettyAMA0,115200 └── amba (引用节点) └── uart101f1000 └── status okayDTS 的层叠复用机制.dts .dtsiSoC级 dtsi (xxx-soc.dtsi) ← 定义芯片所有外设 ↓ #include 板级 dts (xxx-board.dts) ← 使能需要的设备 修改引脚.dtsi是硅片厂商提供的描述芯片本身有哪些硬件资源不管你是否使用。.dts是板级开发者写的决定哪些设备启用、引脚怎么接。四、设备树编译过程内核编译时设备树编译是自动触发的makeARCHarmCROSS_COMPILEarm-linux-gnueabihf- dtbs编译流程.dts 源文件 │ ├── C预处理器 (#include / #define) │ ├── dtc 编译器 │ ├── 语法检查 │ ├── 语义检查 (compatible 字符串规范性等) │ └── 输出平坦设备树 (Flattened Device Tree) │ └── .dtb 二进制文件dtc 源码就在内核里scripts/dtc/目录。执行make scripts会先编译 dtc然后再用 dtc 编译设备树。五、设备树如何被内核使用启动流程中的设备树链路U-Boot │ ├── 将 zImage 加载到内存 ├── 将 .dtb 加载到内存 ├── 设置寄存器 r2 dtb 地址 (ARM32 传参约定) └── 跳转到 zImage 入口 │ ├── 自解压代码 ├── 内核初始化() ├── setup_arch() │ └── 解析 DTB → 生成 platform_device │ ├── 各驱动 probe() │ └── 匹配 compatible 字符串 │ └── 读取 reg/interrupts/gpios 等属性 │ └── 硬件开始工作关键点DTB 在启动时由 Bootloader 传给内核内核解析后生成platform_device结构驱动通过compatible字符串匹配这个过程是完全自动的你不需要写一行 C 代码来描述硬件六、设备树 vs 传统板级代码对比对比维度传统板级代码设备树硬件描述位置内核 C 代码中独立的 .dts 文件修改后是否需要重编内核是只需要重编 DTB同一内核支持多板卡需要重新编译换 DTB 即可代码可读性差C和宏混一起好树状结构直观厂商BSP交付方式内核补丁.dtsi 文件社区认可度已被抛弃当前唯一标准总结设备树的核心思想就是硬件描述与内核代码解耦。DTS 是你写的硬件说明书文本DTC 是翻译官工具DTB 是翻译后的精简版说明书二进制最终由 Bootloader 交到内核手里。理解了这个三件套的分工后面学习节点编写就水到渠成了。

相关新闻

JavaScript高效开发技巧与最佳实践

JavaScript高效开发技巧与最佳实践

1. JavaScript 常用技巧概述JavaScript作为现代Web开发的基石语言,其灵活性和强大功能使其成为前端开发不可或缺的工具。在日常开发中,掌握一些实用技巧可以显著提升代码质量和开发效率。本文将分享一些经过实战验证的JavaScript技巧,这些技巧…

2026/7/23 1:16:30 阅读更多 →
20260719QGis如何计算地块的面积大小(平方米)

20260719QGis如何计算地块的面积大小(平方米)

1.打开地块的.shp文件2.右键左侧目录所需要计算的文件,打开属性,找到字段3.点击上方右侧的算盘(字段计算器)4.填写新建字段的名称,类型一般填小数,右下点开几何图形,双击$area5.点击OK按钮&…

2026/7/20 20:17:04 阅读更多 →
Lens-3.8B-bf16模型配置详解:从config.json到推理参数的最佳实践 [特殊字符]

Lens-3.8B-bf16模型配置详解:从config.json到推理参数的最佳实践 [特殊字符]

Lens-3.8B-bf16模型配置详解:从config.json到推理参数的最佳实践 🚀 【免费下载链接】Lens-3.8B-bf16 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Lens-3.8B-bf16 Lens-3.8B-bf16是一个基于Apple MLX框架优化的3.8B参数文本到图…

2026/7/23 16:24:08 阅读更多 →

最新新闻

层归一化(LayerNorm)原理与在Transformer中的实践

层归一化(LayerNorm)原理与在Transformer中的实践

1. 为什么层归一化是AI模型训练的稳定器第一次在Transformer架构里看到Layer Normalization这个概念时,我正盯着梯度爆炸的损失曲线发愁。那是在调试一个文本生成模型,每当序列长度超过128,反向传播的梯度就会像坐过山车一样剧烈波动。直到把…

2026/7/24 14:35:04 阅读更多 →
C++实现IEC104协议模拟工具:从网络编程到工业通信调试实战

C++实现IEC104协议模拟工具:从网络编程到工业通信调试实战

1. 项目概述:为什么我们需要一个IEC104协议模拟工具? 在电力自动化、工业控制这些领域混久了,你肯定绕不开一个词:IEC 60870-5-104,也就是我们常说的IEC104协议。这玩意儿是电力系统里远动通信的“普通话”&#xff0c…

2026/7/24 14:35:04 阅读更多 →
“同样一堵墙,为何球撞上去反应不同?“——揭秘物理材质 Physic Material

“同样一堵墙,为何球撞上去反应不同?“——揭秘物理材质 Physic Material

引子:小明的"我明明都加了碰撞体,可它们的’手感’怎么天差地别" 小明学会了 Unity 的物理系统。他兴致勃勃地做了个小游戏:让一个小球从高处落下,砸在地面上。 第一次,他给小球和地面都加了碰撞体&#xff…

2026/7/24 14:35:04 阅读更多 →
YOLO姿态估计中关键点错乱问题的分析与解决

YOLO姿态估计中关键点错乱问题的分析与解决

1. 问题背景与现象描述最近在基于YOLO算法实现人体姿态识别项目时,遇到了一个让人头疼的问题:使用crowdPose数据集训练后,模型输出的关键点连接出现了严重的错乱现象。具体表现为肢体关键点之间出现"乱接"情况,比如左手…

2026/7/24 14:35:04 阅读更多 →
实时协作编辑前端的架构复盘:WebSocket 同步、冲突解决与离线支持

实时协作编辑前端的架构复盘:WebSocket 同步、冲突解决与离线支持

实时协作编辑前端的架构复盘:WebSocket 同步、冲突解决与离线支持 一、实时协作的三个核心挑战 实时协作编辑(如 Google Docs、Figma、Notion)的前端架构远比直觉中复杂。表面上只需要 WebSocket 推送变更、前端渲染更新;实际落地…

2026/7/24 14:35:04 阅读更多 →
【AI大模型】思维链提示:CoT让模型推理能力直接翻倍

【AI大模型】思维链提示:CoT让模型推理能力直接翻倍

【AI大模型】思维链提示:CoT让模型推理能力直接翻倍(含实操代码) 在AI大模型提示词工程体系中,绝大多数用户都会遇到同一个核心难题:大模型处理复杂推理、逻辑计算题、多层级分析问题时,经常出现步骤跳脱、逻辑断层、答案出错、想当然结论等问题。哪怕使用高精度大模型,…

2026/7/24 14:34:04 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻