• Android11分区介绍


    1.分区汇总

    3566及3568分区对应如下:

    rockdev/Image-rk3566_rgo/
    ├── boot.img
    ├── dtbo.img
    ├── MiniLoaderAll.bin
    ├── misc.img

    ├── parameter.txt
    ├── recovery.img
    ├── super.img
    ├── uboot.img
    └── vbmeta.img

    2.分区说明

    分区

    说明

    boot.img

    包含ramdis、kernel、dtb

    boot-debug.img

    与boot.img的差别是user固件可以烧写这个boot.img进行root权限操作

    MiniLoaderAll.bin

    包含一级loader

    dtbo.img

    DTB overlay镜像,用于覆盖boot.img中的dtb中的配置

    misc.img

    包含recovery-wipe开机标识信息,烧写后会进行recovery

    recovery.img

    包含recovery-ramdis、kernel、dtb

    parameter.txt

    包含分区信息

    uboot.img

    包含uboot固件

    super.img

    包含odm、vendor、system分区内容

    vbmeta.img

    包含avb校验信息,用于AVB校验

    3.新增分区说明

    3.1 dtbo.img:

    在Android8时,dts中引入了dto的概念。设备树叠加层(DTO)可让主要的设备树(DTB)叠加到设备树上。使用DTO的引导程序可以维护系统芯片(SOC)DT,并动态叠加针对特定设备的DT,从而向树中添加节点并对先用树中的属性进行更改。也就是SOC的设备节点作为DTB,其他设备作为DTO,DTO可以对DTB中的节点进行引用和修改。实现DTO包括分割设备树,编译,分区和运行。这样的好处是厂商可以单独维护自己外设的dtb。

    3.1.1 dtb原有的结构及启动逻辑:

    分区结构:

    启动流程:

    • 将 .dtb 从boot.img的存储空间加载到内存中。

    • 启动内核(已给定所加载 DT 的内存地址)。

    3.1.2 改进后的结构:

    分区结构:

    首先将设备树分割成两 (2) 部分:

    • 主 DT。由 SoC 供应商提供的仅限 SoC 访问的部分和默认配置。

    • 叠加 DT。由原始设计制造商 (ODM)/原始设备制造商 (OEM) 提供的设备专用配置。

    分割设备树之后,您必须确保主 DT 和叠加 DT 之间的兼容性,以便通过合并主 DT 和叠加 DT 为设备生成完整的 DT

    启动流程:

    • 将 .dtb 从boot.img的存储空间加载到内存中。

    • 将 .dtbo 从dtbo.img存储空间加载到内存中。

    • 用 .dtb 叠加 .dtbo 以形成合并的 DT。

    • 启动内核(已给定合并 DT 的内存地址)。

    3.1.3 改后存在的安全问题

    如果dtbo可以覆盖原有的dtb,那么必须保证dtbo的安全性,否则会存在被任意修改的风险,引导加载程序必须确保 DTB/DTBO 安全无虞、未被修改且未被损坏。您可以使用任何解决方案来保护 DTB/DTBO,例如,VBoot 1.0 中的启动映像签名或 AVB 哈希页脚 (VBoot 2.0)。

    • 如果 DTB/DTBO 位于专属的分区中,您可以将该分区添加到 AVB 的信任链。信任链从硬件保护的信任根开始,并进入引导加载程序,从而验证 DTB/DTBO 分区的完整性和真实性。

    3.1.4 dtbo.img编译原理

    以rk3566_r编译为例讲解

    1.指定overlay dtb的配置文件device/rockchip/rk356x/rk3566_r/rk3566_r.mk

    PRODUCT_DTBO_TEMPLATE := $(LOCAL_PATH)/dt-overlay.in

    2.将配置文件编译为dts文件device/rockchip/common/build/rockchip/RebuildDtboImg.mk

    3.将dts文件编译成dtbo.img device/rockchip/common/build/rockchip/RebuildDtboImg.mk

    4.将文件输出到out路径下,device/rockchip/common/build/rockchip/RebuildDtboImg.mk

    5. 增加AVB认证信息到dtbo.img,build/core/Makefile

    3.1.5 验证编译流程

    修改:

    日志:

    3.2 super.img

    3.2.1 简介

    super分区是 Android 的用户空间分区系统。使用此分区系统,您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区,供应商无需担心各个分区(例如 system、vendor 和 product)的大小。取而代之的是,设备分配一个 super 分区,其中的子分区可动态地调整大小。单个分区映像不再需要为将来的 OTA 预留空间。相反,super 中剩余的可用空间还可用于所有动态分区。简单来说就是为了在ota的时候能够灵活创建分区和修改分区大小,将system,vendor,odm,product合并成super分区,并在super分区上预留出一定量的free space,这样就可以动态调整这些分区的大小,解决了ota的时候分区不足,以及调整分区的风险.

    super动态分区是使用 Linux 内核中的 dm-linear device-mapper 模块实现的。 super 分区包含列出了 super 中每个动态分区的名称和块范围的元数据。在第一阶段 init 期间,系统会解析并验证此元数据,并创建虚拟块设备来表示每个动态分区。执行 OTA 时,系统会根据需要自动创建/删除动态分区,或者调整动态分区的大小。由于动态分区是在init阶段用户空间中实现的,因此引导加载程序所需的分区不能是动态的。 例如,引导加载程序会读取 boot、dtbo 和 vbmeta,因此这些分区必须仍保持为物理分区,system-as-root在开启动态分区后也必须关闭。

    OTA调整分区逻辑:

    3.2.2 使能方法

    定义一个分区组:device/rockchip/common/build/rockchip/DynamicPartitions.mk

    BOARD_SUPER_PARTITION_GROUPS := rockchip_dynamic_partitions

    定义分区组涉及的分区:device/rockchip/common/build/rockchip/DynamicPartitions.mk

    BOARD_ROCKCHIP_DYNAMIC_PARTITIONS_PARTITION_LIST := system system_ext vendor product odm

    定义super分区大小:/device/rockchip/common/BoardConfig.mk(非AB分区)

    BOARD_SUPER_PARTITION_SIZE ?= 1631584256(这个分区大小要大于> du -sh (system system_ext vendor product odm)之和)

    定义动态分区大小:/device/rockchip/common/BoardConfig.mk(非AB分区)

    BOARD_ROCKCHIP_DYNAMIC_PARTITIONS_SIZE = $(shell expr $(BOARD_SUPER_PARTITION_SIZE) - 开销)(一般预留的4M是给super元数据和对齐用的

    以上配置完成后,可以通过make superimage编译super.img

    3.2.3 烧写方法

    1.工具烧写,参考工程代码中的RKTools/windows/AndroidTool/RKDevTool_Release_v2.8.zip

    3.3 vbmeta.img

    3.3.1 简介

    验证启动(Verified Boot)是Android一个重要的安全功能,主要是为了访问启动镜像被篡改,提高系统的抗攻击能力,简单描述做法就是在启动过程中增加一条校验链,即 ROM code 校验 BootLoader,确保 BootLoader 的合法性和完整性,BootLoader 则需要校验 boot image,确保 Kernel 启动所需 image 的合法性和完整性,而 Kernel 则负责校验 System 分区和 vendor 分区。

    由于 ROM code 和 BootLoader 通常都是由设备厂商 OEM 提供,而各家实际做法和研发能力不尽相同,为了让设备厂商更方便的引入 Verified boot 功能,Google 在 Android O上推出了一个统一的验证启动框架 Android verified boot 2.0,好处是既保证了基于该框架开发的verified boot 功能能够满足 CDD 要求,也保留了各家 OEM 定制启动校验流程的弹性。

    由于 ROM code 校验 BootLoader 的功能通常与 IC的设计相关,所以 AVB 2.0 关注的重点在 BootLoader 之后的校验流程。BootLoader 之后系统启动所涉及的关键镜像通常包括 boot.img,system.img,Android O 的 treble Project 还引入了 dtbo 和 vendor.img。这些 image 挨个校验可以说费时费力,而 AVB 2.0 的做法事实上十分简单,引入一个新的分区:vbmeta.img(verified boot metadata),然后把所有需要校验的内容在编译时就计算好打包到这个分区,那么启动过程中 BootLoader 只需要校验 vbmeta.img,就能确认 vbmeta 内的数据是否可信。再用 vbmeta 中的数据去比对 bootimg,dtbo,system,img,vendor.img 即可。至于 OEM 是还需要放什么其他东西到 vbmeta 中,则可以由 OEM 自由定制,可以说保留了很好的客制化空间。

    3.3.2 生成过程

    1.使能AVB

    1. BOARD_AVB_ENABLE := true
    2. BOARD_AVB_METADATA_BIN_PATH := path/to/metadata.bin
    3. BOARD_AVB_KEY_PATH := path/to/testkey_psk.pem

    2.使能vbmeta.img编译

    PRODUCT_BUILD_VBMETA_IMAGE := true或者为空

    BUILDING_VBMETA_IMAGE默认为true,如果PRODUCT_BUILD_VBMETA_IMAGE设置为false则禁止编译vbmeta.img

    build/make/core/Makefile (line:3424-3814)

    下图为需要将校验信息写入vbmeta的分区和算法类型及秘钥路径

    如下function是实现将所有上述分区校验内容写入vbmeta分区的工作

    至此,vbmeta.img打包完成,

    查看vbmeta.img的相关信息,可以如下操作:avbtool info_image --image out/target/product/rk3566_r/vbmeta.img

    1. $ avbtool info_image --image out/target/product/rk3566_r/vbmeta.img
    2. Minimum libavb version: 1.0
    3. Header Block: 256 bytes
    4. Authentication Block: 576 bytes
    5. Auxiliary Block: 4480 bytes
    6. Public key (sha1): 2597c218aae470a130f61162feaae70afd97f011
    7. Algorithm: SHA256_RSA4096
    8. Rollback Index: 0
    9. Flags: 0
    10. Release String: 'avbtool 1.1.0'
    11. Descriptors:
    12. Prop: com.android.build.boot.fingerprint -> 'rockchip/rk3566_r/rk3566_r:11/RQ1D.210105.003/huhongliang03261509:user/release-keys'
    13. Prop: com.android.build.boot.os_version -> '11'
    14. Prop: com.android.build.system.fingerprint -> 'rockchip/rk3566_r/rk3566_r:11/RQ1D.210105.003/huhongliang03261509:user/release-keys'
    15. Prop: com.android.build.system.os_version -> '11'
    16. Prop: com.android.build.system.security_patch -> '2021-02-05'
    17. Prop: com.android.build.vendor.fingerprint -> 'rockchip/rk3566_r/rk3566_r:11/RQ1D.210105.003/huhongliang03261509:user/release-keys'
    18. Prop: com.android.build.vendor.os_version -> '11'
    19. Prop: com.android.build.vendor.security_patch -> '2021-02-05'
    20. Prop: com.android.build.product.fingerprint -> 'rockchip/rk3566_r/rk3566_r:11/RQ1D.210105.003/huhongliang03261509:user/release-keys'
    21. Prop: com.android.build.product.os_version -> '11'
    22. Prop: com.android.build.product.security_patch -> '2021-02-05'
    23. Prop: com.android.build.system_ext.fingerprint -> 'rockchip/rk3566_r/rk3566_r:11/RQ1D.210105.003/huhongliang03261509:user/release-keys'
    24. Prop: com.android.build.system_ext.os_version -> '11'
    25. Prop: com.android.build.system_ext.security_patch -> '2021-02-05'
    26. Prop: com.android.build.odm.fingerprint -> 'rockchip/rk3566_r/rk3566_r:11/RQ1D.210105.003/huhongliang03261509:user/release-keys'
    27. Prop: com.android.build.odm.os_version -> '11'
    28. Prop: com.android.build.dtbo.fingerprint -> 'rockchip/rk3566_r/rk3566_r:11/RQ1D.210105.003/huhongliang03261509:user/release-keys'
    29. Hash descriptor:
    30. Image Size: 32274432 bytes
    31. Hash Algorithm: sha256
    32. Partition Name: boot
    33. Salt: be0f003357874d46ffe677d0f59a1bb6110c88e84e7c8d54836e35a446977f67
    34. Digest: f130a7ed8014960a8cf77471f56ffd2912bd6dc89ad1648799d5aa3b7854819e
    35. Flags: 0
    36. Hash descriptor:
    37. Image Size: 623 bytes
    38. Hash Algorithm: sha256
    39. Partition Name: dtbo
    40. Salt: a6978f056ce6e514b373a85b3bdc9a2d4364c86e955dbb616d5dc4dbe817319b
    41. Digest: 58a2113ae2c2d32959f0dde3da13d4a15332f358794a92f0201e165b264e754b
    42. Flags: 0
    43. Hashtree descriptor:
    44. Version of dm-verity: 1
    45. Image Size: 565248 bytes
    46. Tree Offset: 565248
    47. Tree Size: 12288 bytes
    48. Data Block Size: 4096 bytes
    49. Hash Block Size: 4096 bytes
    50. FEC num roots: 2
    51. FEC offset: 577536
    52. FEC size: 8192 bytes
    53. Hash Algorithm: sha1
    54. Partition Name: odm
    55. Salt: 6765e78872a02ab1db93833ea20e2ce6ea16c724
    56. Root Digest: 8215392255b8edbad95b087b5ce094f751af468d
    57. Flags: 0
    58. Hashtree descriptor:
    59. Version of dm-verity: 1
    60. Image Size: 150192128 bytes
    61. Tree Offset: 150192128
    62. Tree Size: 1191936 bytes
    63. Data Block Size: 4096 bytes
    64. Hash Block Size: 4096 bytes
    65. FEC num roots: 2
    66. FEC offset: 151384064
    67. FEC size: 1204224 bytes
    68. Hash Algorithm: sha1
    69. Partition Name: product
    70. Salt: ef4d912a062bde1d810703b5fdc3389b7ea0f46f
    71. Root Digest: e8e327f62e756c3a4a660791ddaf1797c12ae013
    72. Flags: 0
    73. Hashtree descriptor:
    74. Version of dm-verity: 1
    75. Image Size: 840605696 bytes
    76. Tree Offset: 840605696
    77. Tree Size: 6627328 bytes
    78. Data Block Size: 4096 bytes
    79. Hash Block Size: 4096 bytes
    80. FEC num roots: 2
    81. FEC offset: 847233024
    82. FEC size: 6701056 bytes
    83. Hash Algorithm: sha1
    84. Partition Name: system
    85. Salt: dc983ee5b31fdda368e7aeb9dff8e63f7b609ee6
    86. Root Digest: 7a6aa7cbc7f8a9ce1441f034eb55d4e48290788e
    87. Flags: 0
    88. Hashtree descriptor:
    89. Version of dm-verity: 1
    90. Image Size: 38854656 bytes
    91. Tree Offset: 38854656
    92. Tree Size: 311296 bytes
    93. Data Block Size: 4096 bytes
    94. Hash Block Size: 4096 bytes
    95. FEC num roots: 2
    96. FEC offset: 39165952
    97. FEC size: 311296 bytes
    98. Hash Algorithm: sha1
    99. Partition Name: system_ext
    100. Salt: 7a39d514f487b59fa7e66df567f4c98a331ff3e8
    101. Root Digest: 2e8336a5f7baf571c22c5e96ba68581d3aca4b44
    102. Flags: 0
    103. Hashtree descriptor:
    104. Version of dm-verity: 1
    105. Image Size: 521068544 bytes
    106. Tree Offset: 521068544
    107. Tree Size: 4108288 bytes
    108. Data Block Size: 4096 bytes
    109. Hash Block Size: 4096 bytes
    110. FEC num roots: 2
    111. FEC offset: 525176832
    112. FEC size: 4153344 bytes
    113. Hash Algorithm: sha1
    114. Partition Name: vendor
    115. Salt: 55f326a03472a55247dc524b2ba43b38fa159ff4
    116. Root Digest: be741e159d28b6f9070460a325d1b1a18de87599
    117. Flags: 0
  • 相关阅读:
    LLM长度外推——位置插值(llama/baichuan)
    202333读书笔记|《四季读诗》——绿蚁新醅酒,红泥小火炉。晚来天欲雪,能饮一杯无。
    4.Vue-Vue调用第三方接口
    使用 Learner Lab - 使用 Lambda 转换图片为 base64 格式
    Java后端面试八股文汇总
    JS 流行框架(三):Koa2
    【web前端期末大作业】基于html+css+javascript+jquery技术设计的音乐网站(44页)
    pytorch 实现逻辑回归
    栈溢出至getshell分析及利用
    市面上最适合跑步用的耳机有哪些、分享五款最优秀的跑步耳机
  • 原文地址:https://blog.csdn.net/u014645605/article/details/134027304