设备树 dtb结构

设备树 dtb结构dtb 结构由一个小的报头和三个大小可变的部分组成 内存预留块 结构块和字符串块 这些应该按这个顺序出现在扁平的设备树中 因此 设备树结构作为一个整体 当以地址载入内存时 将类似于下图的图 较低的地址位于图的顶部 注 内存预留块可能不存在 尽管在某些情况下可能需要它们来满足单个块的对齐约束 自格式的原始定义以来 已经定义了几种扁平设备树结构的版本 报头中的字段给出了版本 以便客户端程序可以确定设备树是否以兼容的格式编码 本文档仅描述 17 版的格式 兼容 DTSpec 的引导程

目录

1、结构

2、dtb报头

3、内存预留块

3.1、结构

4、结构块

4.2、树结构

5、字符串块

5.1、为什么存在单独的字符串块

6、对齐

7、例子

7.1、报头

7.2、内存预留块

7.3、结构块

7.3.1、树形结构

7.3.2、属性1

7.3.3、属性2

 7.3.4、属性3

 7.3.5、属性4

7.3.6、属性5

7.4、字符串块


1、结构

dtb结构由一个小的报头和三个大小可变的部分组成:内存预留块,结构块和字符串块。 这些应该按这个顺序出现在扁平的设备树中。 因此,设备树结构作为一个整体,当以地址载入内存时,将类似于下图的图(较低的地址位于图的顶部)。  

设备树 dtb结构

注: 内存预留块可能不存在,尽管在某些情况下可能需要它们来满足单个块的对齐约束。  

2、dtb报头

所有报头字段都是32位整数,以大端格式存储 。

struct fdt_header { uint32_t magic; uint32_t totalsize; uint32_t off_dt_struct; uint32_t off_dt_strings; uint32_t off_mem_rsvmap; uint32_t version; uint32_t last_comp_version; uint32_t boot_cpuid_phys; uint32_t size_dt_strings; uint32_t size_dt_struct; };
magic

此字段应包含值0xd00dfeed

totalsize

包含devicetree数据结构的总大小(以字节为单位)。这个大小应包含所有结构的各个部分(报头,内存预留块,结构块和字符串块),以及块之间或最后一块之后的任何空闲空间间隙  

off_dt_struct 结构块的偏移量(从报头开始的字节偏移量)。  
off_dt_strings 字符串块的偏移量(从报头开始的字节偏移量)。
off_mem_rsvmap

内存预留块的偏移量(从报头开始的字节偏移量)。

version 该dtb的版本
last_comp_version

兼容版本信息(此字段应包含设备树数据结构的最低版本,使用的版本与之向后兼容)。

boot_cpuid_phys

这个字段应该包含系统启动CPU的物理ID。 它应该与设备树中CPU节点的reg属性中给定的物理ID相同。  

size_dt_strings

该字段应包含设备树blob的字符串块部分的字节长度。  

size_dt_struct 该字段应包含设备树blob的结构块部分的字节长度  

3、内存预留块

内存预留块向客户端程序提供物理内存中被预留的区域列表; 也就是说,它不应用于一般内存分配。 它用于保护重要的数据结构不被客户机程序覆盖。 

3.1、结构

内存预留块由一个64位大端整数对的列表组成。

struct fdt_reserve_entry { uint64_t address; uint64_t size; };

每一对都给出一个预留内存区域的物理地址和字节大小。 这些给定的区域互不重叠。 内存预留块列表以一个地址和大小都等于0的条目结束。 

注:内存预留块由多个uint64_t组成。  

4、结构

结构块描述了设备树本身的结构和内容。 它由带有数据的标记序列组成,这些标记被组织成一个线性树结构。

FDT_BEGIN_NODE(0x00000001) 标记一个节点表示的开始。 它后面应该有节点的单元名作为额外的数据(即后跟设备节点名称)。 名称存储为一个以空字符结束的字符串,并应包括单元地址(如果有的话)。 如果需要对齐,节点名后面跟着置零填充字节,然后是下一个令牌(可以是除FDT_END之外的任何令牌) 
FDT_END_NODE 标记节点表示的结束。 这个令牌没有额外的数据; 所以紧随其后的是下一个token(可以是除FDT_PROP之外的任何令牌)。  
FDT_PROP

标志着设备树中一个属性表示的开始。 其后应附有描述该属性的额外数据。 这个数据首先由属性的长度和名称组成(这个结构中的两个字段都是32位的大端整数)

struct { uint32_t len; uint32_t nameoff; }

len以字节为单位给出了属性值的长度(可以是0,表示属性为空)

nameoff在字符串块中给出了一个偏移量,在该块中,属性的名称被存储为一个以空字符结束的字符串。 

FDT_NOP 将被任何解析设备树的程序忽略。 这个token没有额外的数据; 因此,紧跟其后的是下一个token(可以是任何有效的token)。 树中的属性或节点定义可以被FDT_NOP标记覆盖,从而将其从树中删除,而不需要在devicetree  blob中移动树表示的其他部分  
FDT_END 标记结构块的结束。 FDT_END token应该只有一个,并且应该是结构块中的最后一个token。 它没有额外的数据; 因此FDT_END标记后面紧接的字节已经从结构块的开始处偏移,该偏移量等于devicetree  blob报头中size_dt_struct字段的值。  

4.2、树结构

设备树结构被表示为一个线性树:每个节点以FDT_BEGIN_NODE token开始,以FDT_END_NODE token结束。 节点的属性和子节点(如果有的话)在FDT_END_NODE之前表示,因此这些子节点的FDT_BEGIN_NODEFDT_END_NODE token被嵌套在父节点的token中。  

结构块作为一个整体由根节点的表示(它包含所有其他节点的表示)组成,后面跟着一个FDT_END标记,表示结构块作为一个整体的结束。  

更准确地说,每个节点的表示由以下组件组成:  

• (可选)任意数量的FDT_NOP tokens

• FDT_BEGIN_NODE token

        —节点名以空字符结尾

        —[置零填充字节对齐到4字节边界]  

• 对于节点的每个属性:

        —(可选)任意数量的FDT_NOP tokens

        —FDT_PROP token

        —[置零填充字节对齐到4字节边界]  

• 描述子节点结束  

     —(可选)任意数量的FDT_NOP tokens

     —FDT_END_NODE token

5、字符串块

字符串块包含设备树中使用的所有属性名称的字符串。这些以空结尾的字符串被简单地连接在一起,并由结构块中的偏移量引用到字符串块中。  

注:字符串块没有对齐约束,可以出现在设备树块开始的任意偏移位置 !

5.1、为什么存在单独的字符串块

原因是为了节省内存空间。在设备树文件中,有很多个节点都有相同的属性名称(如compatible),这些相同名字的字符串只需保留一份。通过在字符串块中的偏移量即可获取到。

6、对齐

内存预留块应该对齐到8字节的边界,而结构块应该对齐到4字节的边界 。

7、例子

/dts-v1/; / { model = "dtb"; compatible = "abc,666", "ABC,999"; status = "okay"; node1 { str = "helloWorld"; }; node2 { val = <100 200>; }; };

7.1、报头

设备树 dtb结构

magic 魔数magic,0xd00dfeed。
totalsize 总字节数,0x000000f4。
off_dt_struct 结构块的偏移量,0x00000038。  
off_dt_strings 字符串块的偏移量,0x000000d4。
off_mem_rsvmap

内存预留块的偏移量,0x00000028。

version 该dtb的版本为17版本,0x00000011。
last_comp_version

兼容16版本信息,0x00000010,即兼容16版本的设备树。

boot_cpuid_phys

系统启动CPU的物理ID,0x00000000。

size_dt_strings

devicetree blob的字符串块部分的字节长度,0x00000020 。

size_dt_struct devicetree blob的结构块部分的字节长度 ,0x0000009c。

7.2、内存预留块

内存预留块:off_mem_rsvmap(0x00000028)off_dt_struct(0x00000038)

设备树 dtb结构

 内存预留块格式如下:

struct fdt_reserve_entry { uint64_t address; uint64_t size; };

地址和大小都为0,表示内存预留块结束(此例未定义内存预留块内容)。

7.3、结构

设备树 dtb结构

结构块偏移:off_dt_struct(0x00000038)

结构块大小:size_dt_struct(0x0000009c)

7.3.1、树形结构

FDT_BEGIN_NODE(0x0001)标记一个节点表示的开始,FDT_END_NODE(0x0002)标记节点表示的结束,FDT_END(0x0009)标记结构块的结束。 

设备树 dtb结构

 /根设备节点

        –node1设备节点

        –node2设备节点

7.3.2、属性1

设备树 dtb结构

token FDT_PROP(0x00000003)
属性值长度 0x00000004
属性名称在字符串块的偏移 0x00000000
属性值 “dtb”
属性名称 “model”

7.3.3、属性2

设备树 dtb结构

token FDT_PROP(0x00000003)
属性值长度 0x00000010
属性名称在字符串块的偏移 0x00000006
属性值 “abc,666”, “ABC,999”
属性名称 compatible

 7.3.4、属性3

设备树 dtb结构

token FDT_PROP(0x00000003)
属性值长度 0x00000005
属性名称在字符串块的偏移 0x00000011
属性值 “okay”
属性名称 status

 7.3.5、属性4

设备树 dtb结构

token FDT_PROP(0x00000003)
属性值长度 0x0000000b
属性名称在字符串块的偏移 0x00000018
属性值 “helloWorld”
属性名称 status

7.3.6、属性5

设备树 dtb结构

token FDT_PROP(0x00000003)
属性值长度 0x00000008
属性名称在字符串块的偏移 0x0000001c
属性值 <100 200>
属性名称 val

7.4、字符串块

设备树 dtb结构

字符串块偏移:off_dt_strings(0x000000d4)

字符串块大小:size_dt_strings(0x00000020)

     

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233771.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 利用Openssl生成证书

    利用Openssl生成证书生成privatekeyopensslgenrsa-des3-outca.key2048生成根证书opensslreq-new-x509-sha384-days3650-keyca.key-outca.crt生成二级证书的privatekeyopensslgenrsa-outsecond.key2048生成二级证书的CSRopensslreq-new-keysecond.key-outsecond.csropen.

    2022年9月19日
    4
  • Python与数据库之学员管理系统「建议收藏」

    Python与数据库之学员管理系统「建议收藏」学院管理系统:一、系统需求二、准备程序⽂件1.分析2.创建程序⽂件三、书写程序1.main.py2.student.py3.managerSystem.py四.总结一、系统需求使⽤⾯向对象编程思想完成学员管理系统的开发,具体如下:系统要求:学员数据存储在MySQL数据库中系统功能:添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、保存学员信息及退出系统等功能。保存学院信息功能可以实现将学员信息每秒自动保存至数据库中。二、准备程序⽂件1.分析为了⽅便维护代码,⼀般⼀个⻆⾊

    2025年11月28日
    6
  • 【C#】创建、解析 xml 文件(XmlDocument 方式)

    【C#】创建、解析 xml 文件(XmlDocument 方式)前言本文使用System.Xml中的XmlDocument解析xml格式的文件。另外,由于我是粗略的看了下官方文档和一些博客,可能会有许多错误的地方,望指出。官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.xml.xmldocument?view=netframework-4.8文章时间:写于2019-7-17…

    2022年6月19日
    25
  • mybatis的拦截器_拦截所有来电怎么设置

    mybatis的拦截器_拦截所有来电怎么设置一、官网介绍MyBatis允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包括:Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)拦截执行器的方法; ParameterHandler(ge…

    2025年10月14日
    2
  • Insecure default in Elasticsearch enables remote code execution

    Insecure default in Elasticsearch enables remote code execution

    2022年1月4日
    44
  • ubuntu18安装yarn、安装vue

    ubuntu18安装yarn、安装vue操作系统为ubuntu18第一步:换源sudopython-c"s=’mirrors.163.com’;importre;f=open(‘/etc/apt/sources.list’,’r+’);a=f.read();f.seek(0);f.truncate();f.write(re.sub(r'(deb|security)\.debian\.org’,s,a));f.clo…

    2022年5月25日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号