内核设备树,你真的了解吗?
在嵌入式系统和内核开发中,设备树(Device Tree, 简称 DT)扮演着至关重要的角色,帮助系统在启动时准确识别硬件配置并匹配合适的驱动程序。虽然设备树应用广泛,但其结构、工作机制及应用细节却不总是被深入理解。本文将从各个方面讲解设备树,带你全面了解这个强大的工具。

1. 什么是内核设备树?
设备树是用于描述硬件结构的文本格式,最初由 Open Firmware 定义,并被引入 Linux 以帮助内核识别和配置硬件。它将硬件描述与内核源码分离,使同一内核可以在不同硬件平台上运行,而不需要针对每个平台编写独特的内核代码。
设备树通常包括:
- 设备树源码(
.dts):描述硬件的文本文件。 - 二进制设备树(
.dtb):编译后的文件,在启动时传递给内核。
通过这种方式,设备树提高了内核对不同硬件平台的兼容性和维护性。
2. 设备树的基本结构
设备树以树形结构组织,使用节点和属性来描述硬件。每个节点代表一个硬件设备或组件,节点内包含的属性定义该设备的特征和配置。

一个示例设备树片段如下:
/ {model = "Raspberry Pi 4";compatible = "raspberrypi,4-model-b";memory {device_type = "memory";reg = <0x0 0x40000000>;};soc {compatible = "simple-bus";#address-cells = <1>;#size-cells = <1>;uart@7e215040 {compatible = "ns16550a";reg = <0x7e215040 0x40>;status = "okay";};};
};
解释:
model和compatible属性:用于识别设备树适用于哪些硬件。reg属性:定义设备在内存中的地址范围。status属性:用于指示设备是否启用。
这种结构使得设备树可以灵活描述各种硬件设备,支持嵌入式系统中常见的不同配置。
3. 设备树的编译与加载
编写好 .dts 文件后,需要通过 dtc 工具将其编译为 .dtb 文件,编译命令如下:
dtc -I dts -O dtb -o output.dtb input.dts
在系统引导过程中,启动加载程序(如 U-Boot)会将 .dtb 文件传递给内核,内核利用 libfdt(设备树解析库)进行解析。解析过程包括从设备树中读取属性并注册硬件设备,以确保所有驱动程序在启动时能正确初始化硬件。

4. 内核如何解析设备树
内核解析设备树时会扫描每个节点并根据 compatible 属性匹配驱动程序。例如,early_init_dt_scan() 函数用于在启动时扫描设备树的根节点和子节点。在内核中实现设备树解析的大致流程如下:
- 引导加载:加载程序将
.dtb文件传递给内核。 - 解析和扫描:内核扫描设备树以获取硬件配置信息。
- 注册设备:根据
compatible属性调用合适的驱动程序。
5. 设备树的调试和问题排查
调试设备树时,可以使用以下方法:
dmesg日志:通过内核日志查看设备树解析是否成功。- 编译后验证:使用
dtc反编译.dtb文件来验证其内容是否正确:dtc -I dtb -O dts -o output.dts input.dtb fdtget工具:用于从.dtb文件中提取属性值。例如:fdtget output.dtb /soc/uart@7e215040 compatible
这些工具可以帮助开发者快速检查设备树的正确性,并在修改时验证更改是否有效。
6. 应用案例:设备树在嵌入式系统中的实践
以树莓派为例,设备树文件用于描述各种外设、引脚映射和总线配置。开发者通过修改设备树可以添加或修改 GPIO、I2C 总线等配置,无需更改内核源码。例如:
- GPIO 配置:通过添加
gpio节点,可轻松定义新的引脚。 - I2C 总线:可以定义从设备和相关属性,确保外设能与总线正确通信。
在其他嵌入式平台上,如 NXP i.MX 系列,设备树用于配置复杂的多核处理器、视频引擎、音频子系统和外部接口。这类设备树通常包含更详细的属性和更复杂的节点结构。
7. 设备树与驱动开发
在编写设备驱动程序时,驱动程序中需要使用 of_match_table 来匹配设备树中指定的 compatible 属性:
static const struct of_device_id my_driver_of_match[] = {{ .compatible = "myvendor,mydevice" },{},
};
MODULE_DEVICE_TABLE(of, my_driver_of_match);
这种匹配机制确保了驱动程序只加载与其 compatible 属性相符的设备。
8. 图解设备树的加载流程
为了更清晰地理解设备树的加载过程,下图展示了设备树的编译和内核解析的全流程:
.dts 文件│└─→ dtc 编译│.dtb 文件│└─→ 启动加载程序(如 U-Boot)│└─→ 传递给内核│└─→ 内核解析│└─→ 注册设备并调用驱动
这种流程图有助于读者快速理解设备树在系统启动过程中的作用。
9. 设备树的未来发展
设备树正不断发展以适应新需求,如动态叠加(Device Tree Overlay),支持在系统运行时动态加载和修改设备树。这使得设备树更加灵活,能够支持热插拔设备和模块化硬件设计。
10. 结论
设备树在现代嵌入式系统中起到了至关重要的作用。它不仅实现了硬件配置的灵活性,还使得内核和硬件的维护更加简单。了解设备树的工作原理、语法和在内核中的应用,可以帮助开发者更高效地开发和调试项目。未来,设备树将会在支持更复杂的系统和动态硬件配置中发挥更重要的作用。
希望这篇博文能让你更全面地理解内核设备树,并在你的项目中自信地运用这一强大工具。
相关文章:
内核设备树,你真的了解吗?
在嵌入式系统和内核开发中,设备树(Device Tree, 简称 DT)扮演着至关重要的角色,帮助系统在启动时准确识别硬件配置并匹配合适的驱动程序。虽然设备树应用广泛,但其结构、工作机制及应用细节却不总是被深入理解。本文将…...
MySQL:客户端工具创建数据库
MySQL 是一个开源的关系型数据库管理系统(RDBMS),用于存储、管理和检索数据。MySQL是基于SQL语言的,它具有高效、可靠、易用的特点。 客户端工具 这个mysqld.exe就在计算机安装的数据可服务,启动之后,mys…...
Linux笔记之pandoc实现各种文档格式间的相互转换
Linux笔记之pandoc实现各种文档格式间的相互转换 code review! 文章目录 Linux笔记之pandoc实现各种文档格式间的相互转换1.安装 Pandoc2.Word转Markdown3.markdown转html4.Pandoc 支持的一些常见格式4.1.输入格式4.2.输出格式 1.安装 Pandoc sudo apt-get install pandoc # …...
【iOS】知乎日报第三周总结
【iOS】知乎日报第三周总结 文章目录 【iOS】知乎日报第三周总结前言评论区文字评论区的一个展开效果评论区数据的一个请求修改了主页获取数据的逻辑主页无限轮播图图片主色调的一个获取将一些拓展部分的内容写在分类里小结 前言 本周笔者因为金工实习整个项目进展比较慢&#…...
【p2p、分布式,区块链笔记 Torrent】WebTorrent的add和seed函数
在【p2p、分布式,区块链笔记 Torrent】WebTorrent的上传和下载界面的示例中,主要通过WebTorrent类的add和seed函数实现相关功能。这两个函数都返回一个Torrent类对象的实例。 seed函数 import createTorrent, { parseInput } from create-torrent // &…...
Redis穿透、击穿、雪崩
redis是一款常用的非关系型数据库,我们常用与作为数据缓存的组件。 接下来介绍一下面试中常被问到的三个概念以及简单的解决方法。 穿透 什么叫缓存穿透 缓冲穿透,是当有一个请求过来时,查询redis缓存不存在,又去查询数据库&…...
VBA高级应用30例应用3在Excel中的ListObject对象:插入行和列
《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…...
2024系统架构师---上午综合题真题(重复考试知识难点)
1.感知层威胁 1)信息窃听:通过搭线或者电磁泄露造成数据隐私泄露;感知执行层主要由各种物理传感器组成,是整个物理信息系统中信息的来源。为了适应多变的环境,网络节点多布置在无人监管的环境中,因此容易被攻击者攻击,常见的针对感知执行层的攻击方式有; 2)感知破坏:…...
连接kafka消息队列报org.apache.kafka.clients.NetworkClient异常
启动kafka后,连接kafka消息队列报org.apache.kafka.clients.NetworkClient异常 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient) 检查kafka运行日志,报The broker is trying to join the wrong clu…...
淘宝商品评论API:代码界的“买家秀”大揭秘
在淘宝这个神奇的购物天堂里,商品评论就像是隐藏的宝藏,等待着我们去挖掘。想象一下,如果你的代码能够自动获取这些评论,那岂不是像拥有了一台时光机,可以穿梭在买家的购物体验之中?今天,我们就…...
RabbitMQ队列详细属性(重要)
RabbitMQ队列详细属性 1、队列的属性介绍1.1、Type:队列类型1.2、Name:队列名称1.3、Durability:声明队列是否持久化1.4、Auto delete: 是否自动删除1.5、Exclusive:1.6、Arguments:队列的其他属性…...
游戏服务器和普通服务器的区别
服务器,顾名思义,是提供服务的设备,在计算机领域,服务器是指具有网络功能的高性能计算机,用于存储、处理和传输数据,而游戏服务器则是专门为游戏提供服务的服务器,它需要具备更高的性能、更稳定…...
Java 中的 Supplier:让数据生成更灵活
文章目录 1. Supplier 基础:无参返回,懒加载的利器2. 与 Optional 配合,优雅地处理默认值3. 惰性初始化缓存:提升性能4. 用于随机数、时间戳等动态数据的生成5. 结合 Stream 实现动态数据流6. 与工厂模式结合,动态创建…...
轻松理解操作系统 - Linux的数据块是如何储存数据的?
python入门 C入门 Linux 由于其开源、比较稳定等特点统治了服务端领域。 也因此,学习Linux 系统相关知识在后端开发等岗位中变得越来越重要,甚至可以说是必不可少的。 因为它的广泛应用,所以在程序员的日常工作和面试中,它都是经…...
青藤深度参编的终端安全国家标准正式发布
近日,国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告,由TC260(全国网络安全标准化技术委员会)归口,公安部第三研究所牵头的GB/T 29240-2024《网络安全技术 终端计算机通用安全技术规范》&…...
软考:去中心化的部署有什么特点
微服务架构被认为是去中心化的,因为它具有以下特点 模块化:微服务架构将应用程序拆分为一系列小型服务,每个服务都是独立的模块,易于维护和扩展 。这种模块化设计使得每个服务可以独立于其他服务运行,没有单一的控制中…...
L8.【LeetCode笔记】回文数
1.题目 https://leetcode.cn/problems/palindrome-number/description/ 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左&…...
双版本android studio安装
安装双版本原因:不同的AS存在不兼容的情况,导致旧版本的项目在新项目下要各种修改,很讨厌,使用双版本,各使用各的就没有这样的问题了。 建议:先安装低版本安装版,再安装高版本免安装版…...
npm镜像的常用操作
查看当前配置的 npm 镜像 npm config get registry切换官方镜像 npm config set registry https://registry.npmjs.org/切换淘宝镜像(推荐) npm config set registry https://registry.npmmirror.com/切换腾讯云镜像 npm config set registry http://mirrors.cloud.tencent…...
Unity插件NodeCanvas之行为树的详细教程
文章目录 前言叶节点 Leafs1、行为 Action2、判断 Condition控制组件 Composites1、顺序执行器 Sequencer2、选择执行器 Selector3、概率选择执行器 Probability Selector4、权重选择执行器 Priority Selector5、平行执行器 Parallel6、轮流选择器 Flip Selector7、完整执行器 …...
基于历史数据的加密货币交易系统策略验证实践指南
基于历史数据的加密货币交易系统策略验证实践指南 【免费下载链接】node-binance-trader 💰 Cryptocurrency Trading Strategy & Portfolio Management Development Framework for Binance. 🤖 项目地址: https://gitcode.com/gh_mirrors/no/node-…...
告别重复操作:用快马生成智能浏览器扩展,极速提升前端调试与数据提取效率
作为一名前端开发者,每天都要和网页元素打交道。调试样式、提取数据这些重复性工作,如果全靠手动操作,不仅效率低下还容易出错。最近我发现用InsCode(快马)平台可以快速生成定制化的浏览器扩展,把那些繁琐操作变成一键自动化&…...
工程仿真平台OpenRocket:从物理试验到数字孪生的技术跃迁
工程仿真平台OpenRocket:从物理试验到数字孪生的技术跃迁 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 在现代工程设计领域,物理…...
Godot-MCP:如何通过双向语义桥梁解决游戏开发中的创意断层问题
Godot-MCP:如何通过双向语义桥梁解决游戏开发中的创意断层问题 【免费下载链接】Godot-MCP An MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude 项目地址: https://gitcode.com/gh_mirrors/god/Godot-MCP …...
别再为日期格式头疼了!Oracle TO_TIMESTAMP函数保姆级使用指南(含常见报错解决)
Oracle TO_TIMESTAMP实战:从混乱字符串到精准时间戳的避坑指南 刚接手一个数据迁移项目时,我对着几十万条格式各异的日期记录发愁——有"2023/12/01"这样的斜杠分隔,也有"01-Dec-23 14.30.00.123"带英文月份缩写和毫秒的…...
系统架构设计师常见高频考点总结之计算机网络
学习这些网络题目时,可以将网络层次结构想象成高速公路系统:核心层是连接城市的大型立交桥和主干道,追求极速转发;汇聚层是出口闸机,负责检查通行证(安全过滤)和分流;而接入层则是通…...
终极揭秘:4步掌握Unity视觉还原技术核心
终极揭秘:4步掌握Unity视觉还原技术核心 【免费下载链接】UniversalUnityDemosaics A collection of universal demosaic BepInEx plugins for games made in Unity3D engine 项目地址: https://gitcode.com/gh_mirrors/un/UniversalUnityDemosaics Universa…...
Ubuntu系统磁盘管理
要在Ubuntu系统中开机自动挂载AWS EBS卷(设备名为/dev/xvdd),需通过**/etc/fstab文件**配置自动挂载规则。以下是完整步骤(含前提条件、命令和验证): 一、前提条件 确认磁盘状态:/dev/xvdd需已…...
Pixel Couplet Gen部署案例:混合云架构(公有云API+私有云模型)方案
Pixel Couplet Gen部署案例:混合云架构(公有云API私有云模型)方案 1. 项目背景与价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。该项目基于ModelScope大模型驱动,通过创新的8-bit像素游戏UI设…...
SmolVLA开发环境搭建:从操作系统安装到模型运行的完整路径
SmolVLA开发环境搭建:从操作系统安装到模型运行的完整路径 如果你刚拿到一台新电脑,或者想把旧机器彻底清理干净,从头开始搭建一个能跑SmolVLA模型的环境,那这篇文章就是为你准备的。很多教程都假设你已经有了一个可用的系统&…...
