从Linus Torvalds一封发飙的电邮开始谈设备树究竟是棵什么树?

[导读] 新版的U-Boot以及内核都引入了设备树,那么这究竟是棵什么样的树呢?长啥样?有啥用?为啥弄个这样的树?本文基于对设备树标准的理解,来学习整理一下相关的要点,供大家参考。

Linux为啥要设备树?

在Linux3.x之前的内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,而且更严重的问题是,由于ARM商业生态模式,基于ARM IP授权模式,产生越来越多ARM核芯片。如此一来这类辣鸡代码越来越多,维护变得愈加困难。于是在2011年3月17这天,Linux之父Linus Torvalds飙了,邮件中骂到:“this whole ARM thing is a f*cking pain in the ass”。

自此之后,Linux内核引入了设备树机制以描述计算机板机底层硬件信息。

啥是设备树?

设备树(device tree)是一种描述特定计算机的硬件组件的数据结构,以便操作系统的内核或者引导程序可以使用和管理那些组件,包括一个或多个CPU,内存,总线和外围设备 。为什么说这个数据结构是树呢?

设备树是通过Open Firmware项目从基于SPARC的工作站和服务器发展而来,由https://www.devicetree.org/组织维护,目前的发展至V0.3版。

来看看设备树标准中的例子:该图显示了一个简单的设备树的示例表示,该树几乎完整到足以启动一个简单的操作系统,描述了平台类型,CPU,内存和1个UART。看这个图,正是一种树形数据结构。

节点

设备树数据结构,本质上由一系列带属性的节点组成,节点由节点名、单元地址以及属性组成。描述节点的语法为:

node-name@unit-address
  • node-name 由1到31个ASCII字符描述,字符可取0-9,a-z,A-Z,逗号(,),点(.),加减号(+ -),以及下划线(_)组成

  • unit-address:节点所在的总线类型。

  • / :表示树的根节点

那么上图的节点是哪些呢?移除掉属性简化一下:

节点的单元地址特定于节点所在的总线类型。单元地址必须与节点的r一般与reg属性中指定的第一个地址匹配。如果节点不具有reg属性,则必须省略@ unit-address,并且节点名称仅会将节点与树中同一级别的其他节点区分开。特定总线的绑定可以为reg和unit-address的格式指定其他更具体的要求。

节点名称,一般按照功能描述进行命令,以提升可读性,比如:

  • adc

  • atm

  • audio-codec

  • audio-controller

  • backlight

  • bluetooth

  • bus

  • .......

路径名path name

通过指定从根节点到所有后代节点到所需节点的完整路径,可以唯一标识设备树中的节点。按照下述约定进行描述:

/node-name-1/node-name-2/node-name-N

比如上图中CPU1的路径为:

/cpus/cpu@1

属性语法

属性用于描述节点的特征,由属性名及值组成。

  • 属性名,可由下表中字符组成:

字符描述
0-9数字
a-z A-Z大小写字母
逗号
.
_下划线
+ -加减号
问号
##字符

    • <empty> 空,无值

    • <u32> <u64> ,大端16进制数,所谓大端模式就是高字节存在低地址

    • <string> 以'\0'字符串结尾的字符串

    • <phandle> 引用设备树中另一个节点的方法。见标准属性中举例。

    • <stringlist>  字符串表

标准属性

  • compatible, 其值为<stringlist>,兼容的属性值包含一个或多个字符串,这些字符串定义了设备的编程模型。使用此字符串列表选择设备驱动程序。该属性值由具有空终止字符串的串联列表组成。它们使设备可以表达与一系列类似设备的兼容性,从而可能使单个设备驱动程序与多个设备匹配。比如

compatible = "fsl,mpc8641", "ns16550";
  • model, <string> 其值为字符串,用于指定设备制造商的型号。如上例中的mpc8641/ns16550

  • phandle,<u32>phandle属性为设备树内唯一的节点指定一个数字标识符。phandle属性值由其他需要引用与该属性关联的节点的节点使用。比如:

pic@10000000 {phandle = <1>;interrupt-controller;
};

定义的phandle值为1。另一个设备节点可以使用一个phandle值1引用pic节点:

another-device-node {interrupt-parent = <1>;
};
  • status,<string> status属性指示设备的运行状态。取值范围定义如下表:

描述
"okay"表示设备使能正运行
"disabled"表示该设备目前禁用,但将来可能会使能
"reserved"表示该设备正在运行,但不应使用。
"fail"表示设备无法运行。发现了一个严重的错误,不进行修理就不可工作。
"fail-sss"与fail的区别是sss字段表示检测到的错误

  • #address-cells 及 #size-cells,可以在设备树层次结构中具有子节点的任何设备节点中使用#address-cells和#size-cells属性,它们描述如何寻址子设备节点。

    • #address-cells属性指示在reg属性中需要多少个单元(即32位值)来形成address字段。

    • #size-cells属性定义子节点的reg属性中size字段需要多少个单元(即32位值)

  • reg, <prop-encoded-array>, ( address , length ) 对。

  • virtual-reg,<u32> virtual-reg属性指定一个有效地址,该地址映射到设备节点的reg属性中指定的第一个物理地址。此属性使引导程序可以为客户端程序提供已设置的虚拟到物理的映射。

  • ranges,<empty> 或 <prop-encoded-array>任意数量的(child-bus-address,parent-bus-address,length)三元组。ranges属性提供了一种定义总线的地址空间(子地址空间)和总线节点的父节点的地址空间(父地址空间)之间的映射或转换的方法。

soc {compatible = "simple-bus";#address-cells = <1>;#size-cells = <1>;ranges = <0x0 0xe0000000 0x00100000>;serial@4600 {device_type = "serial";compatible = "ns16550";reg = <0x4600 0x100>;clock-frequency = <0>;interrupts = <0xA 0x8>;interrupt-parent = <&ipic>;};
};

其中:

<0x0 0xe0000000 0x00100000>;

此属性值指定对于1024 KB的地址空间范围,以物理0x0寻址的子节点映射到物理0xe0000000的父地址。通过这种映射,可以通过地址为0xe0004600的加载或存储,偏移量0x4600(在reg中指定)和在range中指定的0xe0000000映射来寻址串行设备节点。

  • dma-ranges,<empty>或<prop-encoded-array>形式的任意数量的(child-bus-address,parent-bus-address,length)三元组。dma-ranges属性用于描述内存映射总线的直接内存访问(DMA)结构,该总线可以从源于该总线的DMA操作访问其设备树父对象。它提供了一种定义总线的物理地址空间和总线父级的物理地址空间之间的映射或转换的方法。

    • child-bus-address是子总线地址空间内的物理地址。表示地址的宽度取决于总线,并且可以从此节点(出现dma-ranges属性的节点)的#address-cells中确定。

    • parent-bus-address是父总线地址空间内的物理地址。代表父级地址的cell数量取决于总线,可以从定义父级地址空间的节点的#address-cells属性中确定。

    • length指定了子地址空间中范围的大小。可以从节点(定义了dma-ranges属性的节点)的size-cells来确定表示大小的cell数。

总结一下

本文总结了Linux设备树出现的缘由,以及设备树节点常规概念:节点、属性,以及标准属性。设备树还有中断以及中断映射、设备绑定、二进制格式等概念,后续有时间在学习整理。

辛苦原创,如喜欢请点赞/在看/分享,不胜感激!

推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

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

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

相关文章

html两个div间有白线,html-在特定浏览器宽度下,白线出现在渐变填充div的末尾

我有一个ID为#gradient_div的div,其背景图像设置为线性渐变.仅在某些浏览器窗口宽度下,线性渐变的末尾与div #gradient_div的末尾之间才出现缝隙.当我拉伸和收缩浏览器窗口时,这条白线消失并重新出现.似乎与边距有关&#xff1a;>当我将边距设置为margin&#xff1a;0 1&…

递归多线程实现前缀和

http://blog.csdn.net/qq_21361539/article/details/51577263转载于:https://www.cnblogs.com/NEU-2015/p/7857668.html

[Classic] 日文版《出师表》

臣亮言す.先帝业を创めて未だ半ばならずして,中道にして崩祖せり.今天下三分すれども, 益州は疲弊す.此れ诚に危急存亡の秋なり.然れども侍卫の臣,内に懈らず,忠志の士,身を 外に忘るるは,盖し先帝の殊遇を追いて,之を陛下に报いんと欲すればなり.诚に宜しく圣聴 を开张して…

为什么读书了,还不如那些初中毕业的同学

今天群里特别热闹&#xff0c;大家聊了很多&#xff0c;我在旁边看着&#xff0c;很舒服&#xff0c;可能也有人跟我一样&#xff0c;看着这些B神吹牛。像读书时候的卧谈会&#xff0c;大家都聊的很嗨&#xff0c;听的人更嗨&#xff0c;我就是那个喜欢听大家吹牛的人&#xff…

html判断整数小数点后两位小数点,js控制input框只能输入数字和一位小数点且小数点后面只有两位小数...

js控制input框只能输入数字和一位小数点且小数点后面只有两位小数js控制input框只能输入数字和一位小数点且小数点后面只有两位小数212或 0.66; 过滤 00000,1.10,0.00function clearNoNum(obj){obj.value obj.value.replace(/[^\d.]/g,""); //清除“数字”和“.”以…

为什么说卷积神经网络,是深度学习算法应用最成功的领域之一?

目前&#xff0c;作为深度学习的代表算法之一&#xff0c;卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;在计算机视觉、分类等领域上&#xff0c;都取得了当前最好的效果。后来&#xff0c;基于深度神经网络和搜索树的智能机器人“AlphaG…

C语言博客作业--函数

C语言博客作业--函数 一&#xff0c;PTA实验作业 6-2 简单实现x的n次方 1.本题PTA提交列表 2.设计思路 double mypow( double x, int n )函数&#xff08;1&#xff09;定义y1&#xff0c;i用于循环变量&#xff08;2&#xff09;for(i1;i<n;i){ yy*x}用循环实现x的n次方&am…

linux下软件的基本安装和卸载

Linux软件的安装和卸载一直是困扰许多新用户的难题。在Windows中&#xff0c;我们可以使用软件自带的安装卸载程序或在控制面板中的“添加/删除程序”来实现。与其相类似&#xff0c;在Linux下有一个功能强大的软件安装卸载工具&#xff0c;名为RPM。它可以用来建立、安装、查询…

计算机应用基础课程编制标准,计算机应用基础课程标准.doc

计算机应用基础课程标准《计算机应用基础》课程标准一、前言《计算机应用基础》课程是高职院校必修的一门基础课&#xff0c;具有很强的实用性和实践性&#xff0c;是各行各业从事现代化办公&#xff0c;计算机设计及应用领域人才所必须具备的理论知识和时间技能&#xff0c;通…

Linux系统编程 / triggerhappy 源码分析(3.select 的应用)

哈喽&#xff0c;我是老吴&#xff0c;继续记录我的学习心得。一、进步的滞后性我们期望进步是线性&#xff1a;每一个人付出一些努力后&#xff0c;都希望它有立竿见影的效果。现实是&#xff1a;做出努力后&#xff0c;结果的显现往往滞后。只有在几个月或几年后&#xff0c;…

node中定时器, process.nextTick(), setImediate()的区别与联系

1.定时器 setTimeout()和setInterval()与浏览器中的API是一致的&#xff0c;定时器的问题在于&#xff0c;他并非精确的&#xff08;在容忍范围内&#xff09;。尽管事件循环十分快&#xff0c;但是如果某一次循环占用的时间较多&#xff0c;那么下次循环时&#xff0c;他也许已…

[转载]关于NETBIOS理清楚概念的文章

有关网上邻居的问题&#xff0c;问的人一直比较多&#xff0c;在理解上存在的误区也普遍较为严重。鉴于Microsoft的NETBIOS文档不是很细致&#xff0c;我四处收集了一些相关资料加上自己的实践经验写了这个系列&#xff0c;希望能对大家有所帮助&#xff0e; 本来想为了增加可读…

form.html,HTML表单form

前面我们讲了HTML的各种数据输入方式&#xff0c;数据输入之后&#xff0c;一般来说应该提交给后台处理&#xff0c;HTML通过表单form来提交数据。form包含1个或多个数据输入&#xff0c;如input&#xff0c;单选&#xff0c;复选&#xff0c;文件等等form将其包含的输入项&…

今天,给我妈打电话聊了我爸

晚上&#xff0c;给我妈打电话&#xff0c;我爸前两天病了&#xff0c;前几年的大病虽然慢慢康复&#xff0c;但是因为年纪大了&#xff0c;身体机能也慢慢变弱&#xff0c;总是有一些大大小小的问题。前两天我发消息给我爸&#xff0c;我说我们要进新房子了&#xff0c;虽然房…

A Simple Note on P4FPGA: A Rapid Prototyping Framework for P4

论文&#xff1a;P4FPGA: A Rapid Prototyping Framework for P4 Github&#xff1a;https://github.com/p4fpga Reference: Han Wang, Robert Soule ́, Huynh Tu Dang, Ki Suh Lee, Vishal Shrivastav, Nate Foster, and Hakim Weatherspoon. 2017. P4FPGA : A Rapid Prototy…

客户端回调

Client Callback 是ASP.NET 2.0新增的一个特性。简单的说&#xff0c;就是在不刷新页面的情况下&#xff0c;用javascript向服务器端传递参数、调用服务器端的方法、并且得到服务器端的返回值进行处理。 1> Why Client Callback HTTP是无状态的协议。在HTTP协议之上开发的…

初步使用计算机说课,初步认识计算机说课稿

探索、自主发现式学习。根据教材特点与学生实际&#xff0c;我制订以下三维学习目标&#xff1a;1、了解计算机的历史和发展趋势。2、认识计算机的系统组成。3、激发学生学习计算机硬件知识的兴趣。4、提高学生学习、使用计算机的兴趣和互相合作意识品质。三、教学环境&#xf…

万事开头难 - 介绍IMX6ULL启动方式

不同开发板&#xff0c;启动方式不一样&#xff0c;今天我们来介绍imx6ull开发板的启动方式&#xff0c;这非常重要。若不了解清楚启动方式&#xff0c;后面的所有开发工作便无从谈起。本文摘自100ask_imx6ull 开发板 配套学习手册-《嵌入式Linux应用开发完全手册_韦东山全系列…

软件架构培训

在沈阳参加了软件架构培训&#xff0c;感觉非常好&#xff0c;老师讲的很适合我们的应用。真是受益非浅啊&#xff0c;把具体培训内容贴上&#xff1a; 课程名称&#xff1a;OOSE培训 课程目标&#xff1a; • 从广义角度理解软件框架的形成过程&#xff08;RUP的过程裁剪&…

SVN cleanup 反复失败解决办法

svn cleanup cleaning up 操作反复失败&#xff0c;svn提示的问题是版本需要更新&#xff0c;更新成最新的版本之后&#xff0c;依旧反复失败&#xff0c;陷入死循环。还好找一个blog上的方法试了一下&#xff0c;成功了。先说故障环境&#xff1a;OS: win7 x64TortoiseSVN 1.9…