Linux之设备树解耦架构解读-V1.0

术语和缩略语

本文档使用了以下术语和缩略语

Dts:DTS即Device Tree Source,是一个文本形式的文件,用于描述硬件信息。一般都是固定信息,无法变更,无法overlay。

Dtsi:可以理解为dts的公共部分,添加、变更非常灵活。Dtsi包含在dts中。

Dtb:Dtb编译出来的二进制

Dtbo:Overlay编译出来的二进制

dtbo-base:指定overlay是已哪个dtb为base来覆盖的。

Node:树的节点

Property:属性

一、设备树(Device Tree)简介

1. 设备树由来

linux内核源码中,之前充斥着大量的平台相关(platform Device)配置,而这些代码大多是杂乱且重复的,这使得ARM体系结构的代码维护者和内核维护者在发布一个新的版本的时候有大量的工作要做,以至于LinusTorvalds 在2011年3月17日的ARM Linux邮件列表中宣称“Gaah.Guys,this whole ARM thing is a f*cking pain in the ass”这使得整个ARM社区不得不重新慎重考虑平台配置,于是设备树(Device Tree,DT)被ARM社区采用。需要说明的是,设备树最初是由开发固件(Open Firmware)使用的用来向客户程序(通常是一个操作系统)传递数据的通信方法中的一部分内容。在运行时,客户程序通过设备树发现设备的拓扑结构,这样就不需要把硬件信息硬编码到程序中。

2. 设备树的作用

设备树是一个描述硬件的数据结构,甚至你可以将其看成一个大结构体(这个结构体就是平台,成员就是具体的设备),需要注意的是设备树并不能解决所有的硬件配置问题(例如:机器识别),它只是提供一种语言,将硬件的配置从linux内核的源码中提取出来。

Linux使用设备树的主要原因如下

A:平台识别

B:实时配置

C:设备植入

二、设备树解耦目标

目标一 vendor相关修改,完全独立出来,禁止在soc原生的dtsi中修改,只允许以dtbo的方式存在;

目标二 同基线项目dtbo要共二进制

三、设备树解耦框架设计

设备树识别原理及设备树共二进制原理

项目号(Project No)与 PCB ID两个变量同时与dtbo中的两个属性“dtsi_No”“pcb_No”完全匹配,就可以找到对应的dtbo文件。而dtbo可以通过Makefile的控制打包到dtbo.img中,这样就实现了共二进制。

四、设备树代码架构

五、设备树overlay规则

该节内容为overlay机制原生规则,罗列出来帮助驱动工程师解决各种异常问题。

规则1:对于同一个节点的设置情况,dts中的配置会覆盖dtsi中的配置;

规则2:对于节点的修改,先引用后修改;例如原生节点定义如下:

需要在reserved-memory节点中添加一个新的节点或者直接修改reserved-memory节点的属性,都需要先引用reserved_memory节点(注意节点的引用名与节点名可以不一致)

如上案例中,引用reserved-memory节点,并删除了ranges属性,删除了hyp_mem节点,新增了kboot_uboot_logmem节点;

规则3:只有引用申明的节点,在dtsi中“&节点名”才会生效,否则引用点将不生效;例如:firmware节点下fstab 节点的定义如下

firmware:firmware中“:”之前的内容为引用申明。只有申明后才可以在其他地方引用。Firmware下的fstab 节点没有引用声明,在其他位置就不可以引用。如果要修改fstab节点里的属性,引用firmware节点然后修改其中属性,案例如下:

对于同一个节点的设置情况,dts文件中的内容会覆盖dtsi中的。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

六、调试手段

在调试的过程中,没有达到预期时,需要先确定修改有没有编译到对应的dtbo.img中,就需要反编译dtbo.img

1. 反编译工具

反编译工具代码中自带,只需要初始化一下环境变量就可以使用。初始化指令如下:

2. 反编译dtb.img

dtc-I dtb -O dts dtb.img -o dtsi.txt

3. 反编译dtbo.img

mkdtimgdump dtbo.img -b dtbo
dtc -I dtb -O dts dtbo.00 -o dtsi.txt

原文作者:内核工匠
出处: Linux之设备树解耦架构解读-V1.0

 

 

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

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

相关文章

初识Redis——Redis概述、安装、基本操作

目录 一、NoSQL介绍 1.1什么是NoSQL 1.2为什么会出现NoSQL技术 1.3NoSQL的类别 1.4传统的ACID是什么 1.5 CAP 1.5.1 经典CAP图 1.5.4 什么是BASE 二、Redis概述 2.1 什么是Redis 2.2 Redis能干什么 2.3 Redis的特点 2.4 Redis与memcached对比 2.5 Redis的安装 2.6 Docker安装 三…

机器学习(14)--XGBoost

目录 一、概述 二、CART、GB、GBDT 1、CART 2、BT(Boosting Tree提升树) 3、GBDT(梯度提升树) 4、GBDT在sklearn中的损失函数 三、Sklearn中的GBDT 1、加载模块 2、划分数据集 3、建模 4、与随机森林和线性回归对比 5…

教你快速安装Bootstrap

目录 Bootstrap简介Bootstrap的下载Bootstrap的使用 Bootstrap简介 Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作,基于HTML、CSS、JavaScript开发的简洁、直观、强悍的前端开发框架,它会使Web开发更加快捷Bootstrap框架的优点 开发…

GRE实验

题目参考&#xff1a; 实验步骤&#xff1a; 第一步&#xff1a;地址规划拓扑设计&#xff0c;配置IP地址 R1配置&#xff1a; <Huawei>system-view [Huawei]sy R1 [R1]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip address 192.168.1.1 24 [R1-GigabitEthernet0/0/1]in…

异步fifo(1)

什么时异步fifo FIFO&#xff0c;即First In First Out &#xff0c;是一种先进先出的数据缓存器&#xff0c;异步FIFO 是指读写时钟不一致&#xff0c;读写时钟是互相独立的。数据从一个时钟域写入FIFO缓冲区&#xff0c;并从另一个时钟域的同一FIFO缓冲区中读取数据&#xf…

博弈论--sg函数

sg函数------ 定义终止状态的SG函数值为0。如果游戏已经结束&#xff0c;即达到了终止状态&#xff0c;那么对应的SG函数值就是0。即先手的sg值为0&#xff0c;则先手必败&#xff0c;否则先手必胜。 如何求sg函数值--------对于每个可能的移动&#xff0c;将后续状态的SG函数…

Centos 7 使用国内镜像源更新内核

内核选择参考 此博文 &#xff1a;https://blog.csdn.net/alwaysbefine/article/details/108931626 elrepo官网介绍的内核升级方式为&#xff1a; 一、按文档执行引入 elrepo库&#xff1b; # 1、引入公钥 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org# 2、安…

JVM学习之内存与垃圾回收篇1

文章目录 1 JVM与Java体系结构1.0 Java发展重大事件1.1 虚拟机和Java虚拟机1.3 JVM整体结构1.4 Java代码执行流程1.5 JVM架构模型1.6 JVM的生命周期1.7 JVM发展历程 2 类加载子系统2.1 ClassLoader2.2 用户自定义类加载器2.2.1 为什么需要自定义类加载器2.2.2 自定义类加载器的…

go初识iris框架(二) - get,post请求和数据格式

继初步了解iris后 文章目录 获取url路径获取数据get请求post请求获取JSON数据格式JSON返回值获取XML数据格式XML返回值 获取url路径 package mainimport "github.com/kataras/iris/v12"func main(){app : iris.New()app.Get("/hello",func(ctx iris.Conte…

blender 建模马拉松

效果展示 蘑菇模型创建&#xff1a; 创建蘑菇头 shift A &#xff0c;创建立方体&#xff1b; 右下工具栏添加细分修改器&#xff08;视图层级&#xff1a;2&#xff0c;渲染&#xff1a;2&#xff09;&#xff1b;tab键进入编辑模式&#xff0c;alt z 进入透显模式&…

Java:输入与输出

目录 输入输出args 输入Scanner 输入格式化输出文件输入与输出 输入输出 args 输入 利用main函数中的参数args&#xff0c;当然也可以起别的名字。其他语言也是一样的。输入时空格分隔。 args的作用&#xff1a;在程序启动时可以用来指定外部参数 Scanner 输入 需要import j…

[Linux] 守护进程介绍、服务器的部署、日志文件...

守护进程 我们使用的系统中, 一般以服务器的方式工作 对外提供服务的服务器, 都是以守护进程的方式在系统中工作的. 比如, 我们使用Linux服务器时, 大多都会使用一些终端软件通过ssh远程连接服务器使用. 这就是因为, Linux服务器中 通常默认运行着 ssh服务器的守护进程: 守护…