设备树_dtb文件分析

article/2025/10/24 6:43:40

前言:我之前的原计划是没有打算写设备树dtb文件分析,但是情势所迫啊!,学习还是要一步一步来的。
在前面的章节提到过.dts文件以文本方式对系统设备树进行描述,经过Device Tree Compiler(dtc)将dts文件转换成二进制文件binary device tree blob(dtb),.dtb文件可由Linux内核解析,有了device tree就可以在不改动Linux内核的情况下,对不同的平台实现无差异的支持,只需更换相应的dts文件即可。在前面的章节介绍过.dts格式设备树_dts格式(语法)

uboot需要将设备树在内存中的存储地址传给内核。DTB文件主要由大部分组成:头(Header)、结构块(Structure block)、字符串块(Strings block)。DTB文件格式如下图所示:
在这里插入图片描述
在DTB文件中数据存放的格式是大端,DTB文件头部结构体定义如下所示:

struct fdt_header {uint32_t magic;              //设备树魔数,固定为0xd00dfeeduint32_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;    //为在多核处理器中用于启动的主cpu的物理iduint32_t size_dt_strings;   //字符串块大小uint32_t size_dt_struct;    //结构块大小
};
  1. magic表示:设备树魔数,固定为0xd00dfeed,打开DTB文件发现前四个字节为D0 0D FE ED
    在这里插入图片描述
  2. totalsize表示:整个设备树的大小,在前面打图中可以看出jz2440.dtb文件的大小为465 字节,下图红框框起来的16进制的数字为0x01d1转化为10进制位为465(和上图显示的一致)
    在这里插入图片描述
  3. off_dt_struct表示:结构块在整个设备树文件中的偏移地址 为0x48
    在这里插入图片描述
  4. off_dt_strings表示:字符串块在整个设备树文件中的偏移偏移地址 为0x188
    在这里插入图片描述
  5. off_mem_rsvmap表示:保存内存块在整个设备树文件中偏移地址 为0x28
    在这里插入图片描述
  6. 设备树版本的版本好0x11
    在这里插入图片描述
  7. 向下兼容版本号0x10
    在这里插入图片描述
  8. 在多核处理器中用于启动的主cpu的物理id
    在这里插入图片描述
  9. 字符串块大小为0x49
    在这里插入图片描述
  10. 结构块大小为0x140(320)
    在这里插入图片描述
  11. 根据对DTB文件头部的分析和描述内存保留区可知:偏移地址 为0x28,大小为两个64bit(16bytes)
    在这里插入图片描述设备树dts中的内存保留信息会保存在内存保留块(memory reservation block)中
/* dts文件中的内存保留内容:*/
/memreserve/ 0x33f00000 0x100000;

DTB文件内存保留区用下面的结构体描述:

struct fdt_reserve_entry {uint64_t address;uint64_t size;
};

根据上面的内容可以知道:内存保留区的起始地址(address)为0x33f00000,大小(size)为0x100000。

  • 根据对DTB文件头部的分析: 0x48 ~ 0x48+0x140(0x188)为结构块(Structure block)部分,设备树dts中节点的信息会保存在dtb文件中的结构块(Structure block)
/* dts文件中的节点信息内容:*/
/ {model = "SMDK24440";compatible = "samsung,smdk2440";#address-cells = <1>;#size-cells = <1>;memory {  /* /memory */device_type = "memory";reg =  <0x30000000 0x4000000 0 4096>;		};/*cpus {cpu {compatible = "arm,arm926ej-s";};};
*/	chosen {bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";};led {compatible = "jz2440_led";pin = <S3C2410_GPF(5)>;};
};

DTB文件以节点node的形式保存了目标单板上的设备信息。如下所示(红线两边的部分):
在这里插入图片描述结构块(Structure block)部分用于描述设备树节点结构,以0x00000001表示节点的开始。(FDT_BEGIN_NODE)后面紧跟上节点的名字,以0x00000002 表示节点的结束(FDT_END_NODE)。
以0x00000003表示开始描述节点里面的一个属性(FDT_PROP),在0x00000003后面紧跟一个结构体如下所示:

struct {uint32_t len;      //表示属性值的长度uint32_t nameoff;  //属性的名字在字符串块中的偏移
}

上面的这个结构体后紧跟着是属性值,属性的名字保存在字符串块(Strings block)中。以0x00000009表示整个节点结束。

  • 根据对DTB文件头部的分析:0x188 ~ 0x188+0x1D1(0x465)为字符串块(Strings block)部分,如下图所示(红线到结束的部分)
    在这里插入图片描述节点属性的名字全部放在字符串块(Strings block)中。并且属性的名字以0结尾。

http://chatgpt.dhexx.cn/article/CaRZMthU.shtml

相关文章

Linux设备树学习2 - DTB文件格式

一. DTB文件简介 DTB文件是由DTS文件通过dtc命令编译生成的二进制文件。DTS文件不能直接被内核解析&#xff0c;需要编译成DTB文件才可以直接被内核识别并解析使用的。 二. DTB文件内容布局 从上图可以看出&#xff0c;DTB由四个部分组成&#xff0c;分别是struct fdt_header&a…

setUserVisibleHint-- fragment真正的onResume和onPause方法

这个情况仅适合与多个fragment之间切换时统计&#xff0c;而非activity和fragment同时交互&#xff0c;因当时项目为首页4个fargment时长统计&#xff0c;因此适合&#xff0c;经下面网友评论指出&#xff0c;特在这里写出此问题&#xff0c;因最近项目较忙&#xff0c;具体情况…

onCreate与onStart区别,onStart与onResume区别

http://www.cnblogs.com/kofi1122/archive/2011/04/10/2011772.html Activity生命周期之我见 关于Activity生命周期的文章很多&#xff0c;而且大部分也说得很详细&#xff0c;所以作为关于这方面的内容我本来不想多说&#xff0c;但是大家可能跟我之前一样&#xff0c;在看这方…

Flutter BaseWidget 实现onResume、onPause()

熟读唐诗三百首&#xff0c;不会作诗也会吟。——孙洙 最近用Flutter开发的项目算是完成了开发到上线第一阶段了。任何一个项目开始了&#xff0c;若想追求的是更好&#xff0c;那么就需要下功夫对项目用户体验和代码效率深入的研究了。作为用户和产品经理、老板、UI、不懂技术…

Activity生命周期中onStart()和onResume()的区别

Activity生命周期中onStart()和onResume()的区别 在讲onStart()和onResume()的区别之前&#xff0c;必须清楚Activity的四种状态&#xff1a; 1.Running状态&#xff1a;一个新的Activity的启动入栈后&#xff0c;它在屏幕最前端&#xff0c;处于栈的最顶端&#xff0c;此时它…

android Activity的onPause()与onResume()

官方文档地址&#xff1a;http://www.android-doc.com/training/basics/activity-lifecycle/pausing.html#Resume Pause和Resume一个Activity 在一般的app使用中&#xff0c;前台的activity一般是会被视觉组件所遮住的&#xff0c;这就会导致activity的pause。举个例子&#x…

android中onResume、onPause等方法

程序正常启动&#xff1a;onCreate()->onStart()->onResume(); 正常退出&#xff1a;onPause()->onStop()->onDestory() 程序按back 退出&#xff1a; onPause()->onStop()->onDestory(),再进入&#xff1a;onCreate()->onStart()->onResume(); 程序按…

OnStart()方法和OnResume()方法的区别

文章目录 一、Activity的生命周期简述在讲onStart()和onResume()的区别之前&#xff0c;必须清楚Activity的四种状态&#xff1a; 二、OnStart()和OnResume()方法的区别区别&#xff1a; 总结 一、Activity的生命周期简述 在讲onStart()和onResume()的区别之前&#xff0c;必须…

简单介绍几种Java后台开发常用框架组合

01 前言 Java框架一直以来都是面试必备的知识点&#xff0c;而掌握Java框架&#xff0c;不管在成熟的大公司&#xff0c;快速发展的公司&#xff0c;还是创业阶段的公司&#xff0c;都能对当前正在开发中的系统有整体的认知&#xff0c;从而更好的熟悉和学习技术&#xff0c;这…

用IDEA进行Java后台开发(一)

想尝试着进行java后台开发&#xff0c;发现能找到的完整工程教程很多都是用eclipse开发的&#xff0c;于是照着搭了一套开发环境&#xff0c;也简单的写了一个测试代码&#xff0c;由于好几年没有使用eclipse了&#xff0c;快捷键实在用的费劲&#xff0c;遂找到了IDEA这个开发…

Java后台学习路线

2021.01.31.更新 2018.11.10更新&#xff0c;请看文章末尾惊喜 或者点击 https://blog.csdn.net/qq_40374604/article/details/83932163 本文摘自---https://blog.csdn.net/u014624241/article/details/52946378---感谢作者的分享 ①一段摘自知乎的文档 Java就业方向目前主…

Java后台开发一:环境搭建

很久之前就想做Java后台开发了&#xff0c;苦于一直没有找到合适的后台开发教程&#xff0c;某日发现一篇很不错的Java后台开发配置文章&#xff0c;记录如下&#xff1a; jdkeclipsesvnmavenmysqltomcat7.0sublime安装包和jar插件 配置管理工具-SVN http://download.csdn.net/…

Java后台开发知识一览

Java后台开发知识一览 1、后端 WEB服务器&#xff1a;Weblogic、Tomcat、WebSphere、JBoss、Jetty 核心框架&#xff1a;Spring Framework 分布式服务框架 Dubbo&#xff08;感谢浅浅浅丿忧伤指正&#xff09; 安全框架&#xff1a;Apache Shiro 视图框架&#xff1a;Spr…

Java后台开发常见官方网站汇总

Java后台开发常见官方网站汇总 写在前面开发工具篇JDKJavaSE开发文档Oracle数据库&#xff08;收费&#xff09;MySQL数据库&#xff08;免费&#xff09;RedisMongoDBJDBCDruid连接池ElasticsearchKibana——Elasticsearch的客户端RabbitMQMavenGitSpring Framework&#xff0…

【Java后台开发规范】--- 日志的输出

文章目录 前言其他类型的规范 日志输出过多日志重复打印批量打印日志中带方法讲故事日志跟踪其他基本要求 前言 做Java开发的&#xff0c;大多数可能都有看过阿里的Java后台开发手册&#xff0c;里面有关于Java后台开发规范的一些内容&#xff0c;基本覆盖了一些通用、普适的规…

用IDEA进行Java后台开发(二)

这篇博客接上一篇&#xff0c;用IDEA进行Java后台开发&#xff08;一&#xff09; 上一篇我们已经将工程创建完成了&#xff0c;下面我们将创建一个Servlet&#xff0c;然后本地启动tomcat后调用接口&#xff0c;返回helloWorld&#xff0c;过程如下&#xff1a; 1.在src目录…

Java后台开发入门

转载自: 梦回河口&#xff1a;http://blog.csdn.net/zxc514257857/article/details/71152003 1&#xff0c;什么是Web应用程序 Web应用程序是可以通过Web进行访问的应用程序&#xff0c;最大的好处是访问非常容易。比如淘宝、新浪、网易等门户网站   软件开发领域的三大方向…

Java后台开发:环境搭建

jdkeclipsesvnmavenmysqltomcat7.0sublime安装包和jar插件 配置管理工具-SVN http://download.csdn.net/detail/u013142781/9355417 tomcatPluginV331 http://download.csdn.net/detail/u013142781/9355409 Sublime_Text_2.0.2 http://download.csdn.net/detail/u013142781/…

【Java后台】从零开始的Java后台开发(三)

编写基础的Servlet应用程序 1 Servlet 使用Servlet需要在pom.xml中引入以下依赖&#xff1a; <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.…

【Java后台】从零开始的Java后台开发(一)

1. 工具 tomcat 9.0.65ideal 1. Ideal新建项目 File->New->Project 主要修改如下所示几个地方&#xff0c;之后点击create按钮 创建成功后一开始的目录如下所示&#xff0c; 但先不要动项目&#xff0c;它还在后台下载一些东西&#xff0c;下载完成后&#xff0…