设备树dtb文件的格式分析

news2025/8/31 6:12:17

设备树dtb文件的格式分析


文章目录

  • 设备树dtb文件的格式分析
  • DTB文件格式
  • 1.header头部
    • 1.magic
    • 2.totalsize
    • 3.off_dt_struct
    • 4.off_dt_strings字符串的偏移量
    • 5.off_mem_rsvmap 内存保留映射的偏移量
    • 6.version 格式版本
    • 7.last_comp_version最后兼容版本
    • 8.boot_cpuid_phys 我们正在启动的物理CPU ID
    • 9.size_dt_strings字符串块的大小
    • 10.size_dt_struct 结构块的大小
  • 2.memory reservation block(内存预留块)
  • 3.structure block(结构块)
  • 4.strings block(字符串块)


参考设备树内容

/dts-v1/;
/ {
    model = "this is my devicethree!";
        #address-cells = <1>;
        #size-cells = <1>;
    chosen {
        bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";
    };
    cpu: cpu@1 {
            device_type = "cpu";
            compatible = "arm,cortex-a35","arm,armv8";
            reg = <0x0 0x1>;
    };
    
    aliases{
        led1 = "/gpio22020101";
    };
    node1{
        #address-cells = <1>;
        #size-cells = <1>;
        gpio@22020101{
            reg=<0x20110102 0x40>;
        };
    };

    node2{
        node1-child{
            pinnum = <0 1 2 3 4>;
        };
    };
    
    gpio@22020101{
        reg=<0x20110101 0x40>;
        status="okay";
    };
    



};

编译得到dtb文件

/home/alientek/linux/IMX6ULL/linux/temp/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek/scripts/dtc/dtc -I dts -O dtb -o my_device_tree.dtb my_device_tree.dts

使用软件查看生成的dtb文件
在这里插入图片描述

DTB文件格式

DTB文件格式主要分为四个部分:header(头部),memory reservation block(内存预留块),structure block(结构块),strings block(字符串块)。free space(自由空间)
不一定存在。

分布

struct fdt_header
free space
memory reservation block
free spacestructure block
free spacestrings block
free space

1.header头部

struct fdt_header {
    uint32_t magic;             /* magic word FDT_MAGIC */ // FDT_MAGIC 魔数
    uint32_t totalsize;         /* total size of DT block */ // DT块的总大小
    uint32_t off_dt_struct;         /* offset to structure */ // 结构体的偏移量
    uint32_t off_dt_strings;     /* offset to strings */ // 字符串的偏移量
    uint32_t off_mem_rsvmap;     /* offset to memory reserve map */ // 内存保留映射的偏移量
    uint32_t version;         /* format version */ // 格式版本
    uint32_t last_comp_version;     /* last compatible version */ // 最后兼容版本

    /* version 2 fields below */
    uint32_t boot_cpuid_phys;     /* Which physical CPU id we're
                        booting on */ // 我们正在启动的物理CPU ID
    /* version 3 fields below */
    uint32_t size_dt_strings;     /* size of the strings block */ // 字符串块的大小

    /* version 17 fields below */
    uint32_t size_dt_struct;     /* size of the structure block */ // 结构块的大小
};

注意:所有成员类型均为32u,为大端模式
在这里插入图片描述

1.magic

magic的值必须是0xd00dfeed。打开文件。
在这里插入图片描述

2.totalsize

totalsize表示dtb文件的大小。例子中dtb文件大小为676字节。如下图所示:
在这里插入图片描述

totalsize的类型为u32,,所以676字节转换成16进制是0x000002a4。打开文件dtb。

在这里插入图片描述

3.off_dt_struct

off_dt_struct表示structure block(结构块)在dtb文件中的偏移地址。dtb文件中off_dt_struct的值是0x00000038。
在这里插入图片描述

所以structure block(结构块)从下图开始
在这里插入图片描述

4.off_dt_strings字符串的偏移量

off_dt_strings表示(字符串块)在dtb文件中的偏移地址。dtb文件中off_dt_strings的值为0x0000024c。
在这里插入图片描述

所以strings block(字符串块)从下图位置开始。
在这里插入图片描述

5.off_mem_rsvmap 内存保留映射的偏移量

off_mem_rsvmap表示memory reservation block(内存预留块)在dtb文件中的偏移地址,dtb文件中off_mem_rsvmap的值是0x00000028。
在这里插入图片描述

所以memory reservation block(内存预留块)从下图位置开始。
在这里插入图片描述
在这里插入图片描述

6.version 格式版本

version表示设备树数据结构的版本,version的值为0x0000011,对应版本为17。
在这里插入图片描述

7.last_comp_version最后兼容版本

last_comp_version表示向后兼容的版本,17版本向后兼容16版本,所以last_comp_version的值为16。
在这里插入图片描述

8.boot_cpuid_phys 我们正在启动的物理CPU ID

cpu的id值,它的值应该与设备树文件中CPU节点下的reg属性值相等。boot_cpuid_phys为0。
在这里插入图片描述

9.size_dt_strings字符串块的大小

size_dt_strings表示strings block(字符串块)的大小。size_dt_strings的值为0×000000058。
在这里插入图片描述

size_dt_strings的偏移为Ox0000024c,大小为0×00000058,0×25C+58=2a4,所以可以知道strings block(字符串块)在dtb文件中的范围。如下图所示
在这里插入图片描述

10.size_dt_struct 结构块的大小

size_dt_struct表示structure blockl(结构块)的大小。size_dt_struct的值为0×00000214。
在这里插入图片描述

off_dt_struct的偏移值是0×00000038。所以结构块在dtb文件中的范围,如下图所示:0×00000038+0×00000214=24c
在这里插入图片描述

2.memory reservation block(内存预留块)

如果在dts文件中使用memreserve描述保留的内存,保留内存的大小就会在这部分保存。
memreserve的使用方法:

/memreserve/  <address> <length>;

eg

//reserve memory region 0x10000000 .0x4000
/memreserve/  0x10000000 0x4000;

在内存保留块的存储格式:

struct fdt_reserve_entry {
    uint64_t address; // 地址
    uint64_t size; // 大小
};

3.structure block(结构块)

结构块描述的是设备树的结构,也就是设备树的节点。那如何表示一个节点的开始和结束呢。
使用0x00000001表示节点的开始,然后跟上节点名字(根节点的名字用0表示),然后
使用0x00000003表示一个属性的开始(每表示一个节点,都要用0x00000003表示开始),
属性的名字和值用结构体表示。

struct fdt_property {
    uint32_t tag; // 标签
    uint32_t len; // 长度
    uint32_t nameoff; // 名称偏移量
    char data[0]; // 数据
};

len表示属性值的长度,nameoff表示属性名字在字符串块中的偏移。使用0x00000002表示
节点的结束。使用表示根节点的结束。也就是整个结构块的结束。
例子中以下节点在dtb中是如何表示的呢?

/ {
    model = "this is my devicethree!";
        #address-cells = <1>;
        #size-cells = <1>;
    chosen {
        bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";
    };

如下图所示:
在这里插入图片描述

4.strings block(字符串块)

字符串块用来存放属性的名字,比如compatible,reg等。通过分析dtb的头部,我们已经知道字符串块的位置,如model在dtb中的表示:
在这里插入图片描述

0x6D6F6465表示的是model的acell码,表示完一个字符串,用00结尾。

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

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

相关文章

SpringBoot ( 五 ) 封装响应数据

2.6.业务处理 这是通过 Spring 在 Controller中注入Service模型层 而在 Service模型层 结合 Mybatis / Mybatis-Plus 进行数据加工, 数据持久化 2.7.封装响应值 将 业务处理得到数据封装到 Model作用域中, 伴随着转页将信息传递到页面 2.7.1.传值容器 2.7.1.1.Model 在Cont…

【Qt编程之Widgets模块】-001:QButtonGroup抽象容器

1.QButtonGroup简介 QButtonGroup提供了一个抽象容器&#xff0c;可以将按钮小部件放入其中。它不提供此容器的可视化表示&#xff0c;而是管理组中每个按钮的状态。 互斥按钮组&#xff0c;将关闭除已单击的按钮外的所有可选中&#xff08;可切换&#xff09;按钮。默认情况下…

七个合法学习黑客技术的网站,让你从萌新成为大佬

合法的学习网站&#xff0c;以下这些网站&#xff0c;虽说不上全方位的满足你的需求&#xff0c;但是大部分也都能。能带你了解到黑客有关的技术&#xff0c;视频&#xff0c;电子书&#xff0c;实践&#xff0c;工具&#xff0c;数据库等等相关学习内容。以上这些网站我都是用…

项目调研 | Loopring研究报告

一、项目简介及愿景 Loopring协议是一个专为应用程序开发的 zkRollup 协议、一个中继器、一个 L2 非托管交易所、一个智能钱包。用户可以在其中使用、交易和存储资产&#xff0c;同时让资产获得增长。 上述Loopring这些Title具体详情如下&#xff1a; 作为协议&#xff0c;Loop…

latex论文写作实用工具

从pdf定位到latex&#xff1a;ctrl 鼠标左键从latex定位到pdf&#xff1a;ctrl alt jVscode写latex时如何自动换行 最简单的方法就是使用快捷 Alt z 公式识别 SiimpleTex latex格式化 下载链接 在VSCode用户Json文件中添加如下&#xff1a; 表格转换工具 链接 Excel…

YOLOv5改进系列(3)——添加CA注意力机制

【YOLOv5改进系列】前期回顾&#xff1a; YOLOv5改进系列&#xff08;0&#xff09;——重要性能指标与训练结果评价及分析 YOLOv5改进系列&#xff08;1&#xff09;——添加SE注意力机制 YOLOv5改进系列&#xff08;2&#xff09;——添加CBAM注意力机制 目录 &#x1f68…

【Linux】Redis高可用概述1(RDB和AOF的备份恢复)

在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务 &#xff08;99.9%、99.99%、99.999% 等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供正常服 务(如…

优惠卷秒杀——分布式锁

在集群的模式下&#xff0c;有多个jvm&#xff0c;每个jvm内部有他自己的锁&#xff0c;导致并行执行存在线程安全问题 分布式锁&#xff1a;满足分布式系统或集群模式下多线程可见并且互斥的锁 基于Redis实现分布式锁 基于redis锁的初级版本 public interface ILock {/*** …

第十四届蓝桥杯C++--A组题解(更新中)

本来考场上做完想着这回图一乐&#xff0c;打打暴力混个省奖得了&#xff0c;看完民间题解感觉跟自己估计的差不多&#xff0c;应该挺寄的&#xff0c;没想到出分捡了个省一&#xff0c;喜提弱省省一倒数 这篇博客把自己会的题先放上来&#xff0c;其他的题慢慢补&#xff0c;好…

干翻Mybatis源码系列之第八篇:Mybatis提供的缓存方案细节注意

前言 Mybatis缓存设计成了两层的体系&#xff0c;第一层叫做一级缓存&#xff0c;第二层叫做二级缓存&#xff08;全局缓存&#xff09;。我们从这里可以看到Mybatis的缓存方案是有两种处理方式的。 一级缓存&#xff08;默认开启&#xff09; 一级缓存默认开启的&#xff0c…

[天翼杯 2021]esay_eval

[天翼杯 2021]esay_eval <?php class A{ #定义一个名为A的类public $code ""; #定义一个公共属性code function __call($method,$args){ #call魔术方法 当调用一个不存在的成员方法的时候触发eval($this->code); #将code的值以php代码执行 }function __w…

c高级day3作业

#!/bin/bash # 脚本名称:myfirstshell echo hello hostname ls -a .. echo $PATH echo $HOME df -h id -g hostname echo goodbye #!/bin/bash a(ls -l /etc | grep "^-" ) #/etc文件中普通文件 b(ls -l /etc | grep "^d" ) #/etc文件中一级目录文件 …

一篇了解智慧网关

智慧网关是指基于互联网技术的智能网关&#xff0c;能够连接不同的物联网设备和传感器&#xff0c;实现数据采集、信息传递、远程控制、通信管理等功能。作为物联网架构中的核心设备之一&#xff0c;智慧网关在智能家居、智慧城市、智能制造、智能交通、智能农业等领域得到了广…

solidworks三维建模竞赛练习题

solidworks三维建模竞赛练习题&#xff1a;3D01‐ 01 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 02 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 03 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 04 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 05 solidw…

windows docker 创建mysql主从 容器创建mysql主从

1. docker命令新建mysql-master&#xff0c;只是简单测试&#xff0c;没有设置映射&#xff0c;只是验证主从连接&#xff0c;需要可自行添加 docker run --restartalways --name mysql-master --privilegedtrue -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:8.0 2.…

Linux - 第11节 - 网络入门

目录 1.计算机网络背景 1.1.网络发展 1.2.认识 "协议" 2.网络协议初识 2.1.协议分层 2.2.OSI七层模型 2.3.TCP/IP五层&#xff08;或四层&#xff09;模型 3.网络传输基本流程 3.1.同局域网的两台主机通信 3.2.跨网络的两台主机通信 1.计算机网络背景 1.1…

spring事务报错Transaction rolled back because it has been marked as rollback-only

之前经常报"Transaction rolled back because it has been marked as rollback-only"这个异常 字面意思是"事务回滚了&#xff0c;因为它被标记了必须回滚"&#xff0c;最开始完全不懂事务的嵌套&#xff0c;每次出现这个错误都想知道为什么&#xff0c;但…

套接字类型和协议设置

创建套接字 成功返回文件描述符&#xff0c;失败返回-1 int socket (int __domain, int __type, int __protocol) ;__domain&#xff1a;套接字中使用的协议族信息 一般使用PF_INET&#xff08;IPv4互联网协议族&#xff09;&#xff0c;其它协议族不常使用或尚未普及。另外&a…

算法设计与分析:大整数的加减乘除运算

目录 任务描述 相关知识 大整数的思想 大整数加法 大整数减法 大整数与整数的乘法 大整数乘法 大整数与整数的除法 n的阶乘求解思路 编程要求 测试说明 任务描述 本关任务&#xff1a;掌握大整数的基本思想&#xff0c;并运用大整数的基本运算计算出常规整数n的阶乘…

seaweedfs服务启动参数及翻译(seaweed参数、seaweed命令、weed参数、weed命令)(在单个容器同时启动master、volume、filer服务)

文章目录 weed命令翻译weed server命令翻译 weed filer命令 docker容器运行示例&#xff08;docker run命令&#xff09;以下是一个在单个容器启动master、volume、filer服务的示例 weed server 容器debug 版本&#xff1a;3.47从官方镜像docker容器里扒下来的&#xff0c;只扒…