Linux设备树学习(二)设备树的解析

活动地址:CSDN21天学习挑战赛

背景

上一章学习了linux设备树的基本概念,本章节通过实际调试,来进一步熟悉和巩固设备树知识点。

方法

(1)从linux内核中找一个dts文件作为学习对象

        内核版本:linux-5.18.16

         dts文件:zynq-zc770-xm010.dts和zynq-7000.dtsi

(2)通过dtc工具并结合dtc源码学习设备树解析过程

        dtc工具安装:linux下执行sudo apt-get install device-tree-compiler命令

 DTB文件和DTS文件生成

DTB文件布局

 (1)struct ftd_header:存放平台设备树头部相关信息,具体结构体定义如下:

①magic:固定为0xd00dfeed,表明是dtb格式文件

②totalsize:dtb文件的实际大小

③off_dt_struct:dt_struct block相对于起始位置的偏移

④off_dt_strings:strings block相对于起始位置的偏移

⑤off_mem_rsvmap:memory reservation block相对于起始位置的偏移

⑥version:储存的是设备树数据结构的版本

⑦last_comp_version:所用版本向后兼容的最低版本的设备树数据结构,如本版本使用的是17版本,17版本兼容16版本,但不兼容16版本之前的版本

⑧boot_cpuid_phys:官方文档解释如下:

This field shall contain the physical ID of the system’s boot CPU. It shall be identical to the 
physical ID given in the reg property of that CPU node within the device tree. 

⑨size_dt_strings:dt_strings block的长度

⑩size_dt_struct:dt_struct block的长度

 实测结果如下:

根据实例得到dtb的布局如下:

 linxu内核中dtc源码存放位置:./linux-5.18.16/scripts/dtc/libfdt/fdt.h

(2) Memory Reservation Block:要保留的内存的物理地址和大小。保留一些memory进行特殊用途,使得其不会进入内存管理系统。格式说明如下:

本实例中,dts中没有/memreserve/ addr val;故可以看到0x0000_0028之后16个字节(一组配置)全为0

 (3) structure block:结构块描述了设备树本身的结构和内容, 它是由列令牌序列和数据,按照一定的格式组成,详见如下:

 ①FDT_BEGIN_NODE(0x00000001

表示节点的开始,说明后面的内容都是节点信息 。其后接节点名字,节点名字是以NULL结尾的字符串,如果名字中包含地址,则该字符串中也应该包含地址。

②FDT_END_NODE (0x00000002) 

表示节点的结束。FDT_END_NODE 没有额外的信息,它后面马上接着下一个除FDT_PROP之外的token

③FDT_PROP (0x00000003)

FDT_PROP 表示属性的开始,后接属性信息,数据结构如下。在这个数据结构后面,存储是属性的值,其长度为len。如有必要,这个值可以按32bit对齐存储(不足32bit补0)。

struct {
    uint32_t len;        //以字节为单位记录了属性值的长度(长度可能为0,表示一个空值);
    uint32_t nameoff;    //表示属性名在string block中的偏移位置;
}

④FDT_NOP (0x00000004)

FDT_NOP 会被解析程序忽略,这个token没有extra data,所以它后面紧接下一个token。一个属性或节点可以通过FDT_NOP token来覆盖,从而将其从删除,而不需要修改树的其他部分。

⑤ FDT_END (0x00000009)

FDT_END 表示struct block结束,一个dtb文件中应该只包含一个FDT_END token,并且FDT_END token应该是最后一个token。它没有extra data,因此它后面直接接string block的内容。

实测的结果如下图所示:

 上图以cpu@0节点进行说明:

 ① 0x00000001表示开始,其后面的63707540 30000000表示节点名字(4字节对齐)

② 0x00000003表示属性的开始

    0x0000000e表示属性元素的长度

    0x0000001b表示属性名在string block字段中的偏移位置,对于本例,属性名的位置等于

0x00002890+0x0000001b = 0x000028AB。提取出对应的字符串为“compatible”,长度等于0x0e

③ 61726d2c  636f7274  65782d61 39000000表示"arm,cortex-a9"

④ 后面的内容表示device_type = "cpu"(不再详细分析)

(4) string block:属性名对应字符串的集合

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值