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,一经查实,立即删除!

相关文章

【Golang星辰图】解密数据序列化:探索Go语言中的数据序列化库,提升开发效率

提升效率:了解Go语言中的高效数据序列化解决方案 前言 Go语言作为一门流行的编程语言,其生态系统中涵盖了许多强大且高效的数据序列化库。本文将深入探索Go语言的几个著名数据序列化库,包括go-msgpack、go-bson、go-base58、go-json、go-xm…

【pysurvival Python 安装失败】

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

2024系统架构师---隐式调用架构风格的概念与应用

隐式调用架构风格,也被称为事件驱动架构,是一种软件架构模式,其中组件间的交互是基于事件的,而不是直接的调用。这种架构风格侧重于系统中的事件生成、事件监听和事件处理,使组件间的耦合度降低,提高了模块…

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

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

玩转ChatGPT:Suno制作音乐

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

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

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

关于yolov8x6.yaml的一些理解

下面是yaml的内容: # Ultralytics YOLO 🚀, AGPL-3.0 license # YOLOv8 object detection model with P3-P6 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters nc: 80 # number of classes scales: # model compound scaling const…

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

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

Spring面试题系列-6

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。 Spring中的单…

ESP32烧录固件(二种方法)

在选择不同固件时可根据我们的需要选择合适的固件,还需根据开发板Flash的内存大小选择,查看Flash的内存大小,可查阅下面的第二种方法中查看开发板信息。 官方固件 MicroPython - 用于微控制器的Python https://micropython.org/download/ESP…

主函数的三个参数

1).主函数的三个参数的含义: argc:主函数的参数个数 argv:主函数的参数内容 envp:环境变量; 2).演示代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc,char *argv[],char *envp[]) { int i0;printf("argc%d\n&…

API接口开发1688阿里巴巴官方API接口获得店铺详情1688.seller_info-API接入演示

要获取店铺详情&#xff0c;你需要使用1688API接口。以下是一个简单的Python示例&#xff0c;展示了如何使用requests库调用阿里巴巴API并解析返回的数据&#xff1a; # coding:utf-8 """ Compatible for python2.x and python3.x requirement: pip install re…

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

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

第十五届蓝桥杯第二期模拟赛——python

第一题 填空题 1、问题描述 小蓝要在屏幕上放置一行文字&#xff0c;每个字的宽度相同。 小蓝发现&#xff0c;如果每个字的宽为 36 像素&#xff0c;一行正好放下 30 个字&#xff0c;字符之间和前后都没有任何空隙。 请问&#xff0c;如果每个字宽为 10 像素&#xff0c;字符…

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

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

HaDoop学习1

第一章 读时模式&#xff08;Read-Time Schema&#xff09;- 写时模式&#xff08;Write-Time Schema&#xff09; 通常与模式演变&#xff08;Schema Evolution&#xff09;相关 即在数据表结构发生变化时&#xff0c;已经存在的数据如何适应新的模式&#xff1f; 【读时模…

Docker 安装 GeoServer

使用 Docker 安装 GeoServer 是一个更为便捷和灵活的方式&#xff0c;以下是在 Linux 上通过 Docker 安装 GeoServer 的简要步骤&#xff1a; 安装 Docker&#xff1a; 如果您的系统还没有安装 Docker&#xff0c;可以按照 Docker 官方文档&#xff08;https://docs.docker.com…

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

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

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

探究贪心算法&#xff1a;特点与实际应用 探究贪心算法&#xff1a;特点与实际应用&#x1f4dd; 摘要&#x1f680; 引言&#x1f4cb; 正文内容&#xff08;详细介绍&#xff09;&#x1f4cc; 小结&#x1f4ca; 表格总结&#x1f3af; 总结&#x1f52e; 未来展望&#x1f…

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

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