Linux 设备树: 设备树节点与属性在 dtb 文件中的存储

news2024/11/27 18:34:58

前言

  • 当前新版本的 Linux 内核 设备驱动框架,与设备树(Device Tree)结合密切,整体 设备树的设备驱动框架,比较的庞大,但又非常的经典。

  • 一个个的 设备树解析函数,都是前人【智慧】的结晶,了解 设备树的实现,了解设备树的解析,对Linux 设备驱动开发非常有利,并且可以大大提高开发编码能力

  • 虽然Linux 内核庞大、开源,但是Linux 内核各个模块的实现都是经典,非常适合学习深造

设备树 dtb 文件的由来

  • Linux 内核启动后,载入的设备树文件是 dtb,而不是 dts,也就是 设备树 dts 源文件经过类似编译(二进制化)的方式生成 设备树 dtb 文件

  • 那么问题就是: 设备树 dts 或者 dtsi 中文本描述的设备树节点 node 与属性 property,如何呈现在设备树 dtb 文件中?直接改为二进制,还是有一定的转换规则?

  • 经过对比设备树源文件 dts 与 设备树生成的 dtb 二进制文件,并查看对应的代码,找到了转换的规则,并不是简单的二进制化。

二进制化规则

  • 设备树源文件,大概有三类文件组成:

    • (1)设备树源文件 dts,一个 dts 文件生成一个 dtb 文件
    • (2)设备树源文件的头文件 dtsi,类似于 C 语言的 include 头文件,可以有多个,dtsi 中也可以包含 更多的 dtsi
    • (3)设备树 dt-bindings C 语言的头文件,这些头文件中,大部分都是【宏定义】,并不包含 C 语言的结构体,用于代替设备树中的【宏】
  • 其实 设备树 源文件生成 设备树 dtb 的过程,有点类似于 C 语言的编译过程,大概有两个过程:【预处理】部分,把 设备树 dts 文件 当成 C 源文件,把 设备树 dtsi 与 设备树 C 语言的 .h 头文件当成 C 语言 头文件,预处理后就生成一个设备树文件(中间文件),然后再使用 dtc 工具 进行转换(类似于 C 语言的编译)。

设备树 dtb 构成

  • 设备树 dtb 文件构成可以参考 设备树的规范文件:设备树规范可以通过 https://github.com/devicetree-org/devicetree-specification 获取到,当前版本是 devicetree-specification-v0.4.pdf

  • 设备树很复杂?其实就是由 节点 (node) 与 属性 (property)构成的

  • 可以有多个节点,一个节点下面,可以包含多个节点。以实际树做个比喻,树干、树枝、树叶,树枝可以包含多级树枝,最后是树叶。

  • 设备树中 树根、树干、树枝、树叶,都用 【节点】或者【容器】来表示。而属性 property,一个设备树节点的描述细节,可以有多个,附属于某个设备树节点。

  • 如果设备树 节点 是个树叶,那么 这个设备树 节点的属性可以有大小、颜色等描述用的属性

设备树 dtb 中 C 语言的描述与实现

  • 设备树 dtc 工具如何转换 设备树源文件到目标 dtb 文件?设备树 dtc 工具也是由 C 语言编写的,位置在 Linux 内核 scripts\dtc\dtc.c

  • dtc 的 设备树源文件只能输入一个,如果一个设备树包含 dts、多个 dtsi、多个 .h dt-bindings C 语言的头文件,需要借助 gcc 工具进行预处理,这样转换为一个中间的 设备树 源文件,也就是 包含的dtsi 文件被真实文件内容填充,【宏定义】被真实的数据代替。为了管理(解析)方便,再经过 dtc 工具,转换为 最终的 dtb 格式的文件。

  • 设备树 dtb 的 C 语言描述, scripts\dtc\libfdt\fdt.h ,节点 fdt_node_header 与 属性 fdt_property

struct fdt_node_header {
	fdt32_t tag;
	char name[];
};

struct fdt_property {
	fdt32_t tag;
	fdt32_t len;
	fdt32_t nameoff;
	char data[];
};
  • 可以看到,节点就是一个【容器】的概念,每个节点包含一个或者多个 属性 struct fdt_property

  • 节点用于归类或者分组,类似于定义一个【结构体】,属性 struct fdt_property 是其中的成员。

  • 注意这里 的 struct fdt_property 与Linux 内核 of 中 解析使用的 struct property 不太一样,因为这里的 struct fdt_property 关注的是 属性的物理存放规则, struct property 是设备树【树化】展开使用的属性描述节点(包含链表等层次结构化成员)。

  • struct fdt_property 的设备树节点,就是【并排】的堆叠操作,可以认为是 flat 扁平化的,【属性1】【属性2】。。。【属性N】。

如何区分 设备树节点与设备树 属性

  • 设备树节点使用 FDT_BEGIN_NODE,也就是 32位值 00 00 00 01 四个字节表示一个设备树节点的开始, 使用 FDT_END_NODE,也就是 32位值 00 00 00 02 四个字节表示一个设备树节点的结束
#define FDT_BEGIN_NODE	0x1		/* Start node: full name */
#define FDT_END_NODE	0x2		/* End node */
  • 设备树节点的属性,使用 FDT_PROP,32位值, 00 00 00 03 作为 tag 的方式,用于设备树属性的开始
#define FDT_PROP	0x3		/* Property: name off,
					   size, content */
  • 设备树 结构部分:设备树节点、设备树属性,结束使用 FDT_END 表示,也就是 32位值 00 00 00 09 表示 设备树结构部分的 【结束】
#define FDT_END		0x9
  • 设备树 dt 并不是 设备树源文件的 直接二进制化,而是有个转换(翻译)规则,比如 设备树节点或者属性都有 name 属性,而 name 属性本身也是个字符串,而这些 name 属性都聚集到了一起,形成了 string 区域,所以类似于 compatible = "rockchip,rk3368-i2c", "rockchip,rk3288-i2c"; 属性, 存储到 dtb 时, compatible 字符串 放在了 string 字符串区域struct fdt_property 中使用 字符串区域的偏移 fdt32_t nameoff来表示,而 "rockchip,rk3368-i2c", "rockchip,rk3288-i2c" 属性值,是以实际字符串的方式存储(4字节对齐)。

  • 如此看来, 设备树 dtb 文件有三个区域组成:

    • (1)设备树 头部,结构体是 struct fdt_header
    • (2)设备树节点与属性存放区域 dt_struct,包括 struct fdt_node_headerstruct fdt_property
    • (3)设备树 字符串区域,主要是 设备树节点与属性的 name 字符串,用于索引,好处就是【公用】,比如很多设备树节点中都有 compatible 属性,这里公用一个 compatible name 字符串,也就是 属性中的 name 字符串也要存储,只是为了【公用】,并且索引管理方便,集中存放在一个区域。

在这里插入图片描述

小结

  • 本篇简单描述 dtb 文件的存储构成,了解了 dtb 文件的构成(内容),才能更好的管理与解析设备树,或者更好的利用好设备树。

  • 设备树不只是用于Linux 这个系统,一些嵌入式系统,理论上也可以使用设备树,当然可能占用一些额外的资源,比如 u-boot 中已经普及使用设备树了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1558363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务监控:确保分布式系统的可观察性与稳定性

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 一、前言二、微服务监控的重要性三、关键监控指标四、常用监控工具五、最佳实践六、结论 一、前言 在当前的软件开发领域&a…

2.快速排序

快速排序 思想:双指针法(左右指针法) 时间复杂度:O(n log n)(最理想的情况下) 最坏的情况:输入的数组已经是有序的或者接近有序时 快速排序的性能会退化到O(n^2) 我们的快速排序其实就是让两…

Wezterm配置

Windows 的图形界面目前来说在有图形界面的系统中,表现最稳定 linux 的终端最方便 和 tui 程序也多 我建议winodws安装 wsl 既可以使用 linux的环境和可以使用windows的桌面 关键 neovide --wsl 的表现很棒 如果项目的历史提交很多而且,工程很大&#xf…

C++STLmap,set

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

吴恩达2022机器学习专项课程(一) 4.4 学习率

问题预览/关键词 学习率太小有什么影响?学习率太大有什么影响?如果成本函数达到局部最小值,使用梯度下降还能继续最小化吗?为什么学习率固定,而最小化成本函数的步幅却越来越缓?如何选择合适的学习率&…

前端学习<二>CSS基础——12-CSS3属性详解:动画详解

前言 本文主要内容: 过渡:transition 2D 转换 transform 3D 转换 transform 动画:animation 过渡:transition transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征,可以实现元素不同状态间的平滑过渡…

2024 MCM数学建模美赛2024年A题复盘,思路与经验分享:资源可用性与性别比例 | 性别比例变化是否对生态系统中的其他生物如寄生虫提供优势(五)

审题 第四问让我们探究性别比例变化是否对生态系统中的其他生物如寄生虫提供优势。这里我们可以把问题简化一下,只探究性别比例会不会对寄生虫提供优势。因为考虑太多生物,会使模型更复杂,我这个水平处理不了这么复杂的问题,是我…

宠物领养(源码+文档)

宠物领养管理系统(小程序、ios、安卓都可部署) 文件包含内容程序简要说明含有功能项目截图客户端主页举报页注册页领养详细发布寻宠/送养领养页 管理端送养管理用户管理科普管理签到管理 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库 5、…

【javaWeb 第八篇】后端-Mybatis(万字详细学习)

Mybatis框架 前言MybatisMybatis入门配置SQL提示JDBC数据库连接池lombok Mybatis基础操作日志输出Mybatis的动态SQL 前言 这篇是作者学习数据持久层框架Mybatis的学习笔记,希望对大家有所帮助,希望大家能够与作者交流讨论 Mybatis Mybatis是一款优秀的…

书生·浦语大模型实战营之轻松玩转书生·浦语大模型趣味案例

书生浦语大模型实战营 为了帮助社区用户高效掌握和广泛应用大模型技术,我们重磅推出书生浦语大模型实战营系列活动,旨在为开发者们提供全面而系统的大模型技术学习课程。加入我们,一起深入大模型全流程,从零搭建 RAG、多模态和智…

23种设计模式之创建型模式 - 单例模式

文章目录 一、单例模式1.1单例模式定义1.2 单例模式的特点 二、实现单例模式的方式2.1 饿汉式2.2 懒汉式2.3 双重检查锁:2.4 静态内部类2.5 枚举实现(防止反射攻击): 一、单例模式 1.1单例模式定义 单例模式确保系统中某个类只有…

基于SSM汽车交易系统

基于SSM汽车交易系统的设计与实现 摘要 电子商务的兴起不仅仅是带来了更多的就业行业。同样也给我们的生活带来了丰富多彩的变化。多姿多彩的世界带来了美好的生活,行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面,信息技术至始至终…

Geoserver中CQL_FILTER的使用

概述 在Geoserver中可通过CQL_FILTER对要素进行过滤,CQL_FILTER即支持属性过滤也支持空间过滤,本文通过实际的例子演示如何使用CQL_FILTER。 简介 CQL(Common Query Language)是为OGC目录规范创建的纯文本语言。GeoServer对其进行了调整,使…

批量爬取招聘网站【Boss直聘】上工作岗位的招聘信息

不管是学生还是工作的小伙伴,估计都对不同岗位工作几年的薪酬水平比较感兴趣。本文提供爬取招聘网站,获取某类工作招聘信息的实现逻辑和代码。具体的实施步骤是:明确爬取的招聘网站—确定爬取的工作城市—确定爬取的岗位—获取岗位的招聘子链…

前端学习<二>CSS基础——13-CSS3属性:Flex布局图文详解

前言 CSS3中的 flex 属性,在布局方面做了非常大的改进,使得我们对多个元素之间的布局排列变得十分灵活,适应性非常强。其强大的伸缩性和自适应性,在网页开中可以发挥极大的作用。 flex 初体验 我们先来看看下面这个最简单的布局…

【蓝桥杯嵌入式】六、真题演练(一)-1演练篇:第 届真题

温馨提示: 真题演练分为模拟篇和研究篇。本专栏的主要作用是记录我的备赛过程,我打算先自己做一遍,把遇到的问题和不同之处记录到演练篇,然后再返回来仔细研究一下,找到最佳的解题方法记录到研究篇。 解题记录&#x…

了解 LoadRunner 性能测试软件及其基础使用

目录 一、了解LoadRunner 1、什么是Loadrunner? 2、Loadrunner包括什么组件? (1)前台组件 (2)后台组件 二、LoadRunner三大组件 1、VuGen(虚拟用户脚本生成器) (…

2024全开源小狐狸ai付费创作系统V2.8.0

源码介绍 小狐狸GPT付费体验系统的开发基于国外很火的ChatGPT,这是一种基于人工智能技术的问答系统,可以实现智能回答用户提出的问题。相比传统的问答系统,ChatGPT可以更加准确地理解用户的意图,提供更加精准的答案。同时&#x…

算法---动态规划练习-10(删除并获得点数)

题目 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址:点这里 2. 讲解算法原理 rob_s函数:这个函数实现了经典的"打家劫舍"问题的算法。使用动态规划的思想,通过填表的方式计算在给定范围内能够获取的最大点数。 f和…

Windows入侵排查

目录 0x00 前言 0x01 入侵排查思路 1.1 检查系统账号安全 1.2 检查异常端口、进程 1.3 检查启动项、计划任务、服务 0x00 前言 当企业发生黑客入侵、系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时…