Android dtbo(1) dto简介
设备树 (DT, Device Tree) 是用于描述 non-discoverable(google这样写的,意思应该就是硬件信息看不到) 硬件的命名节点和属性构成的一种数据结构。操作系统(例如在 Android 中使用的 Linux 内核)会使用 DT 来支持 Android 设备使用的各种硬件配置。硬件供应商会提供自己的 DT 源文件,接下来 Linux 会将这些文件编译成引导加载程序使用的DTB(Device Tree BLOB)文件。
设备树叠加层 (DTO,Device Tree Overlay) 可以使主要的dtb文件被overlay。使用 DTO 的引导加载程序可以维护系统芯片 (SoC) DT,并动态叠加针对特定设备的 DT,从而向树中添加节点并对现有树中的属性进行更改。
例如,像高通这种芯片厂商,针对某个soc,会在kernel中有个dts,描述了自己公版的硬件信息。把该soc卖给不同的手机厂商,如小米,oppo等,它们会在自己的device里再写个dts,也就是dtbo,做自己的个性化定制。自己的dtbo+高通的dtb形成系统中最终的设备树,这样方便厂商和芯片商维护各自的设备树。
本页详细介绍了引导加载程序加载 DT 的典型工作流程,并列出了常见的 DT 术语。
1、Android9的更新
在android9中,bootloader在将统一的dtb传递给kernel之前,不能修改dtbo中定义的属性。
1.1 加载设备树
在bootloader中使用设备树需要三个阶段,即构建、分区和运行,如下图所示:
1.构建
使用dtc将设备树*.dts文件编译为*.dtb文件
将dtb文件烧到开发板中bootloader可以访问的位置
2.分区
如需进行分区,请在bootloader可以访问的可信位置放置dtb文件,如下面所示,左边是将dtb与kernel一起放到boot分区,方法是将其附件到image.gz,并作为"kernel"传递给mkbootimg。右边是将dtb单独放在一个分区。
3.运行
将.dtb从存储(emmc)加载到内存(ddr)中
启动内核(已给定所加载DT的内存地址)
2.术语
本文和接下来关于dto的文章的一些术语解释
术语 | 含义 |
---|---|
DT | Device Tree |
DTB | Device Tree Blob |
DTBO | Device Tree Blob for Overlay |
DTC | Device Tree Compiler |
DTO | Device Tree Overlay |
DTS | Device Tree Source |
FDT | Flattened Device Tree, a binary format contained in a .dtb blob file |
3. 实现DTO
实现DTO包含以下步骤:
分割设备树
构建
分区
运行
同时,还必须保持两个DT之间的兼容性,并确定一个策略保证两个分区的安全性。
3.1 分割DT
将系统中的dt分割成两个部分:
- 主 DT: 一般在kernel中,由SOC厂商提供,包含soc的默认配置
- Overlay DT:由ODM/OEM提供,一般放在device中,包含某个device的特定配置
3.2 构建主DT和叠加层DT
构建主DT,执行以下操作:
- 将主DT的 .dts 编译为 .dtb 文件。
- 将 .dtb 文件刷写到bootloader在运行时可访问的分区。
如需构建叠加 DT,请执行以下操作:
- 将叠加DT .dts 编译为 .dtbo 文件。虽然此文件格式与格式设为扁平化设备树的 .dtb 文件相同,但是用不同的文件扩展名可
- 将其与主 DT 区分开来。
- 将 .dtbo 文件刷写到引导加载程序在运行时可访问的分区。
3.3 对DT进行分区
在闪存中确定bootloader在运行时可访问和可信的位置信息以放入 .dtb 和 .dtbo。
主DT的示例位置:
- 作为boot分区的一部分,附加到内核 (image.gz)。
- 单独的 DT blob (.dtb),位于专用分区 (dtb)。
叠加 DT 的示例位置:
如左图,将.dtbo单独放在一个分区,如dtbo分区
如右图,将 .dtbo 放入 odm 分区中(仅在您的bootloader能够从 odm 分区的文件系统中加载数据时才这样做)
注意: dtbo分区的大小取决于主dtb需要被更改的量,一般8M足够了。
对于支持无缝 (A/B) 更新的设备,请用 A/B 来标识主 DT 和叠加 DT 分区:
3.4 在bootloader中运行
如需运行,请执行以下操作:
- 将 .dtb 从存储空间加载到内存中。
- 将 .dtbo 从存储空间加载到内存中。
- 用 .dtb 叠加 .dtbo 以形成合并的 DT。
- 启动内核(已给定合并 DT 的内存地址)。
4. 保持兼容性
主 DTB(来自 SoC 供应商)会被视为 DTBO 的 API surface。将设备树分离为 SoC 通用部件和设备专用部件后,您必须确保这两个部件以后相互兼容,包括:
- 主 DT 中的 DT 定义(例如,节点、属性、标签)。主 DT 中的任何定义更改都可能会触发叠加 DT 中的更改。例如,如需更正主 DT 中的某个节点名称,请定义映射到原始节点名称的“别名”标签(以免更改叠加 DT)。
- 叠加 DT 的存储位置(例如,分区名称、存储格式)。
5. 确保安全
引导加载程序必须确保 DTB/DTBO 安全无虞、未被修改且未被损坏。您可以使用任何解决方案来保护 DTB/DTBO,例如,VBoot 1.0 中的启动映像签名或 AVB HASH footer (VBoot 2.0)。
- 如果 DTB/DTBO 位于专属的分区中,您可以将该分区添加到 AVB 的信任链。信任链从硬件保护的信任根开始,并进入bootloader,从而验证 DTB/DTBO 分区的完整性和真实性。
- 如果 DTB/DTBO 位于现有分区(如 odm 分区)中,该分区应位于 AVB 的信任链中。(DTBO 分区可以与 odm 分区共享一个公钥)。
Android dtbo(1) dto简介的更多相关文章
- 【转】Android 防破解技术简介
http://www.cnblogs.com/likeandroid/p/4888808.html Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是 ...
- GitHub Android Librarys Top 100 简介
GitHub Android Librarys Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索J ...
- Android Activity动画属性简介
Android Activity动画属性简介 在Android当中 设置activity的动画 需要复写 android:windowAnimationStyle这个属性 我们自定义一个动画样式来继承 ...
- Android 防破解技术简介
Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是随之而来的问题也越来越多,这其中比较令人头疼的问题就是:有些不法分子利用反编译技术破解 App,修改 ...
- <Android开源库 ~ 1> GitHub Android Libraries Top 100 简介
转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...
- android hook 框架 libinject2 简介、编译、运行
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 ADBI 简介、编译、运行
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- Android休眠唤醒机制简介(二)
本文转载自:http://blog.csdn.net/zhaoxiaoqiang10_/article/details/24408911 Android休眠唤醒机制简介(二)************* ...
- Android休眠唤醒机制简介(一)【转】
本文转载自:http://blog.csdn.net/zhaoxiaoqiang10_/article/details/24408129 Android休眠唤醒机制简介(一) ************ ...
- GitHub Android Libraries Top 100 简介
本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过 ...
随机推荐
- telegraf 常用命令总结
本文为博主原创,转载请注明出处: Telegraf 是一个灵活的服务器代理,用于收集和报告指标.它支持插件驱动,这意味着你可以根据需要添加或修改功能. 1.使用telegraf --help 查看te ...
- 【WebSocket】一个简单的前后端交互Demo
WebSocket资料参考: https://www.jianshu.com/p/d79bf8174196 使用SpringBoot整合参考: https://blog.csdn.net/KeepSt ...
- vue3的defineAsyncComponent是如何实现异步组件的呢?
前言 在上一篇 给我5分钟,保证教会你在vue3中动态加载远程组件文章中,我们通过defineAsyncComponent实现了动态加载远程组件.这篇文章我们将通过debug源码的方式来带你搞清楚de ...
- games101 作业6 详解SAH
games101 作业6 详解SAH 可参考资料:https://www.pbr-book.org/3ed-2018/Primitives_and_Intersection_Acceleration/ ...
- CF1730G
CF1703G 链接: Problem - 1703G - Codeforces 题目大意: 你有 \(n\) 个箱子.第 \(i\) 个箱子中有 \(a_i\) 个硬币.你需要按照从箱子 \(1\) ...
- 从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章)
从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章) 1.简介 该项目整合了编程.AI.产品设计.商业科技及个人成长等多领域的精华内容,源自顶 ...
- 简单理解.net 依赖注入的三种方式
前言 :.NET5.0 于2020年11月10日正式发布,它是3.1之后的 .NET Core 的下一个主要版本.微软将这个新版本命名为 .NET 5.0 而不是 .NET Core 4.0,其原因有 ...
- Mac安装Adobe PS_AE_PR等系列软件提示错误代码146怎么办?
在安装Mac版Adobe系列软件的时候,不管PS.AE.PR.AI等,如果出现错误代码146,下面两个方法能够轻松解决. 解决方法一:需要我们打开「系统设置」-「隐私与安全」-「App管理」,打开「i ...
- Python if __name__ == "__main__" 解释
一种机制,允许脚本以不同的方式运行,这取决于作为独立的程序执行还是作为模块被其他脚本导入.这种机制就是 if __name == "__main__" 其作用是控制某些代码块只在该 ...
- Session的运行机制
浏览器通过web访问服务器,服务器的web服务开启后,第一步就是开启session,这也是session的第一阶段: session_start() 这个函数的作用:开启session,然后根据以前设 ...