在网上查了很多的资料,有很多写的不错,但很系统的比较少。 我只是按自己的思路把

文档理顺一下。按如下的思路:

问题是什么,原理是什么,具体怎么去解,然后实际的打印log。

问题在前一篇已经写完,已经找到了内核的入口android-verity.c。

这里还是要补充一下dm的原理,否则的话,不管是别人写的文档还是下面写的东西,

你会很难理解,主要是代码的运行机制,怎样做到dm里说的分块去验证。可参看网上的介绍

Device mapper ”,都写的很详细,可能大部分都是抄成一样的,而且有些缺陷是跟Android下的

linux有点对不上,但不妨碍我们对概念和原理的理解,如下提几个重要单词。

1、 mapped_device -- 映射表是由 dm_table.c 文件中定义的 dm_table
                   dm_target1……
      dm_table          dm_target结构数组 = mapped_device 到它某个 target device 的映射关系
      dm_table 结构中将这些 dm_target 按照 B 树的方式组织起来方便 IO 请求映射时的查找操作
       Dm_target 结构具体记录该结构对应 target device 所映射的 mapped device 逻辑区域的开始地址和范围,

同时还包含指向具体         target device 相关操作的 target_type 结构的指针。

target_type 才是内核代码真正操作的函数集。

2、网上介绍的一般都是从用户态触发校验,但system却不是,这个信息很关键,很重要,否则你无法

理解在Android下找不到对应的dm_ioctl

内核部分代码

kernel-4.4/init/do_mounts_dm.c
        static void __init dm_setup_drives(void)
           dm_table_add_target(table, target->type, target->begin, target->length, target->params)

kernel-4.4/drivers/md/dm-table.c
       int dm_table_add_target(struct dm_table *t, const char *type, sector_t start, sector_t len, char *params)
             tgt->type = dm_get_target_type(type);
             r = tgt->type->ctr(tgt, argc, argv);

kernel-4.4/drivers/md/dm-target.c
          static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
         static int verify_verity_signature(char *key_id, struct android_metadata *metadata)

static struct target_type android_verity_target = {
         .name                   = "android-verity",
         .version                = {1, 0, 0},
          .module                 = THIS_MODULE,

kernel-4.4/drivers/md/dm-verity-target.c

static struct target_type verity_target = {
      .name        = "verity",
      .version    = {1, 4, 0},
       .module        = THIS_MODULE,
       .ctr        = verity_ctr,
       .dtr        = verity_dtr,
       .map        = verity_map,
        .status        = verity_status,
        .prepare_ioctl    = verity_prepare_ioctl,
        .iterate_devices = verity_iterate_devices,
        .io_hints    = verity_io_hints,
    };

3、好了,在这我从其他人的文档或官网抄些资料。

主流程,Android 官方文档如下:

– Generate an ext4 system image.

– Generate a hash tree for that image.

– Build a dm-verity table for that hash tree.

– Sign that dm-verity table to produce a table signature.

– Bundle the table signature and dm-verity table into verity metadata.

– Concatenate the system image, the verity metadata, and the hash tree.-----------

a、   注意---注意- 注意---只签了这个- dm-verity table,也就是说在挂system的时候,刚开始只是简单对

             这个总表做一个验证,这样节省验证时间,同时也把对应的验证链表建完 (根据传入

的参数建一张表,等下对比使用)

b、 dm-verity table的概念非常重要,这涉及到kernel里如何通过这个描述,去恢复建立一张表

看一下如何建立verity-table。实际上,verity-table就是为了去描述之前生成的hash tree。

  1. def build_verity_table(block_device, data_blocks, root_hash, salt):

  2. table = "1 %s %s %s %s %s %s sha256 %s %s" 

  3. table %= ( block_device,   block_device,

  4. BLOCK_SIZE,    BLOCK_SIZE,    data_blocks,

  5. data_blocks,   root_hash,   salt)

  6.  主要的脚本在:build/tools/releasetools/build_image.py  BuildImage 函数 中

4、重要的实际上是在第3点,内核中启动验证。

static struct target_type verity_target = {
        .name        = "verity",
        .version    = {1, 4, 0},
        .module        = THIS_MODULE,
        .ctr        = verity_ctr,
        .dtr        = verity_dtr,
        .map        = verity_map,

int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)

/* WQ_UNBOUND greatly improves performance when running on ramdisk */
              v->verify_wq = alloc_workqueue("kverityd", WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM | WQ_UNBOUND,                       num_online_cpus());

(Target_type 结构主要包含了 target device 对应的 target driver 插件的名字、定义的构建和删除该类型target device的方    法、    该类target device对应的IO请求重映射和结束IO的方法等)。

Device mapper本质功能就是根据映射关系和target driver描述的IO处理规则,将IO请求从逻辑设备mapped device

转发相应的target device上。generic_make_request和submit_bio接口 中定向到mapped device的所有块读写IO请求。

IO请求在device mapper的设备树中通过请求转发从上到下地进行处理。当一个bio请求在设备树中的mapped deivce向下层转       发时,一个或者多个bio的克隆被创建并发送给下层target device。

注意: 一个image对应一个verity table,这个信息很重要,在内核只会建立一次,其他的节点都是动态

添加进去的不断变大Tree,通过work队列等机制。

5. 了解dm-verity的相关接口后,就可以在用户空间对他进行初始化了。在Android中fs_mgr_verity负责用户空间对Dm-verity进行控制的,

其中有个load_verity_table这个函数展示了如何从用户空间去使用dm-verity。先贴出代码。

static int load_verity_table(struct dm_ioctl *io, char *name, char *blockdev, int fd, char *table) {

tgt->length=device_size/512;

strcpy(tgt->target_type, "verity");

6、 log

[    2.930724] <4>.(4)[1:swapper/0]device-mapper: init: adding target '0 1 android-verity PARTUUID=a4da8f1b-fe07-433b-95cb-84a5f23e477b '
[    2.932247] <4>.(4)[1:swapper/0]device-mapper: android-verity: key:id:7e4333f9bba00adfe0ede979e28ed1920492b40f dev:PARTUUID=a4da8f1b-fe07-433b-95cb-84a5f23e477b
[    2.936164] <1>.(1)[1:swapper/0]device-mapper: android-verity: bio magic_number:2952900609 protocol_version:0 table_length:254

[    2.937600] <1>.(1)[1:swapper/0]device-mapper: android-verity: verity_table: 1 /dev/block/platform/bootdevice/by-name/system /dev/block/platform/bootdevice/by-name/system 4096 4096 903183 903183 sha256 a2608f0b20824a417440f72bf3177468fbbd8f4124fd78b724ac54a4268da478 aee087a5be3b982978c923f566a94613496b417f2af592639bc80d141e34dfe7
[    2.941296] <6>.(6)[1:swapper/0] verify_verity_signature debug begin

[    2.960841] <4>.(4)[1:swapper/0]device-mapper: android-verity: android-verity mounted as verity target
[    2.962172] <6>.(6)[1:swapper/0] func verity_iterate_devices enter
[    2.963066] <6>.(6)[1:swapper/0] func verity_iterate_devices enter
[    2.963947] <6>.(6)[1:swapper/0] func verity_io_hints enter
[    2.964749] <6>.(6)[1:swapper/0] func verity_iterate_devices enter

[    2.969174] <6>.(6)[1:swapper/0]  func verity_map enter
[    2.971341] <0>.(0)[273:exe_cq]  func verity_end_io enter
[    2.972144] <4>.(4)[186:kworker/u16:4] func verity_work enter
[    2.972972] <4>.(4)[186:kworker/u16:4] func verity_verify_io enter
[    2.974899] <4>.(4)[186:kworker/u16:4]  func verity_finish_io enter

[    2.977011] <6>.(6)[1:swapper/0]  func verity_map enter
[    2.978025] <0>.(0)[273:exe_cq]   func verity_end_io enter
[    2.978869] <4>.(4)[186:kworker/u16:4]  func verity_work enter
[    2.979698] <4>.(4)[186:kworker/u16:4]  func verity_verify_io enter
[    2.980581] <4>.(4)[186:kworker/u16:4]  func verity_finish_io enter

[   11.335907] <1>.(2)[441:kworker/u16:9]  func verity_work enter
[   11.335910] <1>.(2)[441:kworker/u16:9]  func verity_verify_io enter

[    6.652958] <5>.(0)[425:boot_logo_updat]  func verity_map enter
[    6.653727] <5>.(2)[405:android.hardwar]  func verity_map enter
[    6.653840] <5>.(2)[418:vendor.mediatek]  func verity_map enter
[    6.654051] <5>.(3)[431:surfaceflinger]  func verity_map enter
[    6.654400] <5>.(6)[424:audioserver]  func verity_map enter

[    9.031733] <2>.(6)[772:patchoat]  func verity_map enter
[    9.032981] <2>.(6)[615:camerahalserver]  func verity_map enter
[    9.032999] <2>.(6)[615:camerahalserver] func verity_map enter
[    9.035876] <2>.(6)[519:HwBinder:397_1]  func verity_map enter

[   15.430523]  <6>.(6)[1601:droid.bluetooth]  func verity_map enter
[   15.430523] <6>.(0)[1610:droid.deskclock] func verity_map enter

Android Verified Boot dm-verity 优化和实战2相关推荐

  1. Magisk root 原理分析之二 :Android Verified Boot (AVB)

    1. Android Verified Boot (AVB) 或称 Verified Boot 2.0 简介 官方解释:验证用户设备上运行的软件完整性.它通常从设备固件的只读部分开始,该部分加载代码并 ...

  2. Android Verified Boot 2.0 最新安卓P AVB详解

    什么是AVB 验证启动是确保用户设备运行软件完整性的一整套流程. 它通常从设备固件的只读部分启动,使用加密方式验证代码是可靠且没有任何已知的安全缺陷之后才会执行. AVB是验证启动的一种实现. VBM ...

  3. AVB校验微观版本:android avb(Android Verified Boot)验证

    前辈原文:https://blog.csdn.net/weixin_43836778/article/details/90400147 其实可能有人会说,怎么整这么多重复的,其实不是的.这是为了不断地 ...

  4. 深入解析:Android卡顿检测及优化项目实战经验总结,任君白嫖

    前言 之前在项目中做过一些Android卡顿以及性能优化的工作,但是一直没时间总结,趁着这段时间把这部分总结一下. GitHub系统教程学习地址:https://github.com/Timdk857 ...

  5. Android Verified Boot dm-verity 优化和实战

    目录 一.AVB 技术背景 二.代码实现逻辑 一.AVB 技术背景 Android O/P 版本以来,谷歌加入了system-as-root的特性,此时ramdisk和system是一起放在同一个sy ...

  6. Android/Linux boot time分析优化

    如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...

  7. Android安全启动学习(五):Android Verified Boot 2.0

    1.AVB概要 AVB2.0被用于启动引导,此用法添加一个"vbmeta.img"镜像. public key被编译到bootloader中用于校验vbmeta数据,vbmeta. ...

  8. MTK Android 9.0(Android P) + kernel-4.9 默认关闭DM Verity 和secure boot 解决无法adb remount的问题

    在android P版本上执行adb remount会提示以下错误: remount of the / superblock failed: Permission denied remount fai ...

  9. Spring Boot进阶:原理、实战与面试题分析

    在当下的互联网应用中,业务体系日益复杂,业务功能也在不断地变化.以典型的电商类应用为例,其背后的业务功能复杂度以及快速迭代要求的开发速度,与5年前的同类业务系统相比,面临着诸多新的挑战. 这些挑战中核 ...

  10. 《Spring Boot+Vue全栈开发实战》读书笔记

    写在前面 嗯,回家处理一些事,所以离职了,之前的公司用开源技术封装了一套自己的低代码平台,所以之前学的spring Boot之类的东西都忘了很多,蹭回家的闲暇时间复习下. 笔记整体以 Spring B ...

最新文章

  1. Flume的安装与配置
  2. IBM沃森健康项目受挫 人工智能在医疗领域前景几何
  3. lottie 导出html,Lottie Web动效基本原理
  4. 绝对和相对误差(absolute relative error)
  5. 学科实践活动感悟50字_“五育并举”的一次生动实践——洪雅实验中学研学活动感悟...
  6. 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)
  7. Android仿华为天气绘制刻度盘
  8. 集成Silverlight 2的AJAX框架 Visual WebGui
  9. 深入Managed DirectX9(十五)
  10. 游戏开发入行大师攻略
  11. Protel 介绍 protel99se正式汉化版下载 Protel DXP2004简体中文版
  12. SCSI代码分析(3)SCSI设备的管理2
  13. 北京地区主要旅行社目录
  14. Qt如何获取外网IP地址
  15. JDK Required: 'tools.jar' seems to be not in IDEA classpath解决办法
  16. 什么是研究报告,研究报告分为那些部分
  17. redis中使用GeoHash
  18. 获取post请求的几种常见方式
  19. 【深圳】大湾区第三次.NET技术交流会(网络直播)
  20. 简述几种常用的编码器数据格式

热门文章

  1. 程序员转公务员之Hello World
  2. Python数据可视化的例子——折线图(line)
  3. ask调制流程图_利用卷积神经网络的自动调制分类算法
  4. 跳石头 解题报告【二分答案】
  5. Leetcode PHP题解D1:宝石与石头
  6. js 拉勾网效果_js仿拉勾网首页穿墙广告效果
  7. 设计一个单选题考试程序python_Python123计算机等级考试二级Python语言与程序设计通关指南七Python 计算生态...
  8. IDEA 后退/前进 快捷键
  9. 零线断了为什么会带电, 使验电笔氖管发光
  10. android 仿QQ表情,长按查看动图,移动手指可切换图片