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

前言

  • 当前新版本的 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.mzph.cn/news/783068.shtml

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

相关文章

【pysurvival Python 安装失败】

这个错误与 sklearn 包的名称更改有关,导致 pysurvival 在构建元数据时失败。现在,你需要修改 pysurvival 的安装文件以使用正确的 scikit-learn 包名 编辑安装文件:找到 pysurvival 的安装文件,可能是 setup.py 或 pyproject.to…

智慧公厕:改变城市生活的革命性基础设施

在现代城市的高品质生活要求背景下,公共厕所成为了不可或缺的基础设施。然而,传统的公厕在服务质量、管理效率方面存在一定的问题。为了提供更好的公厕服务,智慧公厕应运而生。通过智能化的管理模式,智慧公厕实现了公厕使用与管理…

玩转ChatGPT:Suno制作音乐

AI开始进军音乐领域了。 一款音乐AI神器——Suno V3发布,它能够处理从间奏到主歌、副歌、桥段直至尾奏的完整结构,零门槛创作音乐。 需要科学上网,官方网站:https://app.suno.ai/ 使用GPT写个歌词,然后丢进Suno生成…

Web APIs知识点讲解(阶段七)

正则表达式 1.能够利用正则表达式校验输入信息的合法性2. 具备利用正则表达式验证小兔鲜注册页面表单的能力 一.正则表达式 1.正则表达式 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也…

光明源@智慧厕所公厕软件系统有哪些核心功能?

在现代城市的建设中,智慧公厕的建设成为了提升城市品质和居民生活质量的重要举措。而智慧公厕的核心,不仅仅在于其硬件设备的智能化,同样重要的是其背后支持的智慧厕所公厕软件系统。让我们一起探讨,智慧厕所公厕软件系统有哪些核…

【C++】开散列实现unordered_map与unordered_set的封装

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:手撕哈希表的闭散列和开散列 > 毒鸡汤:谁不是一边受伤,一边学会坚强。 > 专栏选自:C嘎嘎进阶 > 望小伙伴们…

c语言例题,实现一个整型有序数组的二分查找

c语言中,有很多可以实现效果的方法,而在一个整型有序的数组中,我们可以使用二分查找的方法来实现对于一个数组中的元素查找。二分查找的优点在于本身需要的计算是比较少的,一次计算查找排除掉数组中一半的元素,尤其对于…

Topaz Photo AI for Mac v2.4.2 智能AI降噪软件

Topaz Photo AI是一款适用于Mac的图像处理软件,使用人工智能技术对照片进行编辑和优化。该软件提供了多种强大的功能,包括降噪、锐化、消除噪点、提高分辨率等,可以帮助用户改善图像质量,并实现自定义的效果。 软件下载&#xff1…

探究贪心算法:特点与实际应用

探究贪心算法:特点与实际应用 探究贪心算法:特点与实际应用📝 摘要🚀 引言📋 正文内容(详细介绍)📌 小结📊 表格总结🎯 总结🔮 未来展望&#x1f…

C#.net8创建webapi,使用SqlSugar,仓储模式,DTO,服务层,控制层的综合应用(企业级)

本文源码地址: https://download.csdn.net/download/u012563853/89036104 源码中,也有详细的注释说明。 代码总览: 这是一个综合性比较强的文章,需要有一定的基础,没有基础的人,看了后,会全面的了解一下,有基础的人,看了后会加强认识,更加的巩固,直接在项目中去应…

详解 Java 中的 volatile 关键字

引言: 在 Java 编程中,volatile 是一个非常重要的关键字,用于修饰变量。它主要用于确保多个线程之间对共享变量的修改能够被及时地更新到主内存,并且能够保证可见性。然而,需要注意的是,volatile 关键字并不…

PS之更换背景色

1.更换背景色 导入图片后, 选中快速选择工具, 依次点击 选择主体 -> 选择并遮住 其后右边会出现一栏 “属性”, 拉到最下面的 “输出设置”, 选择净化颜色, 然后确认 此时应该得到抠出来的物体. 右下角点击新建图层 此时对图层2打开拾色器, 将图层2 设为白色 然后CTRL…

二维码门楼牌管理应用平台:创新管理与服务的全新方式

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、二维码门楼牌管理应用平台的功能特点三、切换功能在城市管理中的应用四、二维码门楼牌管理应用平台的未来展望 前言 在数字化时代的浪潮中,二维码技术以其便捷、高效的特点,正逐渐渗透到我们生…

ArrayList和LinkedList的区别【大白话Java面试题】

ArrayList和LinkedList的区别【大白话Java面试题】 大白话回答 arraylist和linkedlist的区别是:数据结构不同,效率不同,自由性不同,主要控件开销不同 数据结构不同 ArrayList是Array(动态数组)的数据结构,LinkedList…

leetcode 周赛 391场

2. 换水问题 给你两个整数 numBottles 和 numExchange 。 numBottles 代表你最初拥有的满水瓶数量。在一次操作中,你可以执行以下操作之一: 喝掉任意数量的满水瓶,使它们变成空水瓶。用 numExchange 个空水瓶交换一个满水瓶。然后&#xf…

JAM计数法C++

题目&#xff1a; 代码&#xff1a; #include <iostream> using namespace std; int main() {int s,t,w;cin>>s>>t>>w;char a[26];cin>>a; //输入给出的jam数字for(int i1;i<5;i) //循环找哪个字母递增{for(int jw-1;j>0;j--){if(a[j]1&…

【41-60】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【41-60】计算机网络基础知识&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用41、使用 Session 的过程是怎样的&#xff1f;42、Session和cookie应该如何去选择&#xff08;适…

知识蒸馏详解及pytorch官网demo案例

知识蒸馏Knowledge Distillation(KD) 1、简介 一种模型压缩方法 知识蒸馏的一般框架&#xff08;如下图&#xff09; 三部分&#xff1a;知识、蒸馏算法、师生架构。 知识 将知识分为三种形式&#xff1a;基于响应的&#xff08;response-based&#xff09;、基于特征的&…

数字乡村发展蓝图:科技赋能农村实现全面振兴

目录 一、数字乡村发展蓝图的内涵与目标 二、科技赋能农村&#xff1a;数字乡村发展的动力与路径 &#xff08;一&#xff09;加强农业科技创新&#xff0c;提升农业生产效率 &#xff08;二&#xff09;推进农村电商发展&#xff0c;拓宽农民增收渠道 &#xff08;三&…

MHA高可用配置与故障切换

前言&#xff1a; MHA高可用故障就是单点故障&#xff0c;那么我们如何解决单点故障MHA中Master如何将故障的机器停止&#xff0c;使用备用的Slave服务器 一 MHA定义 MHA&#xff08;MasterHigh Availablity&#xff09;是一套优秀的Mysql高可用环境下故障切换和主从复制的…