活动地址: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命令
(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:属性名对应字符串的集合