AVB 部分流程

fs_mgr

仅有部分关键函数


函数入口点:system/core/init/main.cpp-->int main()-->BuiltinFunctionMap& function_map = GetBuiltinFunctionMap();
//function_map 中有所有库中的函数的映射后的命令,以do_mount_all  ~~ mount_all 为例

vbmeta verity 相关

AvbHandle::Open()
    FsManagerAvbOps::AvbSlotVerify()
    AvbVerifier::Create(); //1
    AvbVerifier::VerifyVbmetaImages(const std::vector<VBMetaData>& vbmeta_images) //2
        VerifyVbmetaDigest<SHA256Hasher>(vbmeta_images, digest_); //针对不同的加密方式使用不同的vbmeta校验方式,还有hash512,并结合1/2 
	
do_mount_all()
    MountAllResult fs_mgr_mount_all(Fstab* fstab, int mount_mode)
        AvbHashtreeResult AvbHandle::SetUpStandaloneAvbHashtree(FstabEntry* fstab_entry,
                                                                bool wait_for_verity_dev)
            AvbUniquePtr AvbHandle::LoadAndVerifyVbmeta(const FstabEntry& fstab_entry,
                                                    const std::vector[std::string](std::string)& preload_avb_key_blobs) //返回一个avb_handle
                    LoadAndVerifyVbmetaByPath()
            AvbHandle::SetUpAvbHashtree()
                LoadAvbHashtreeToEnableVerity()
                    DeriveAvbPartitionName() //将fstab blk 中带后缀的名字重命名: system_a  system
                    GetHashtreeDescriptor()
                    HashtreeDmVeritySetup() //最后准备工作
                        ConstructVerityTable()
                        SetBlockDeviceReadOnly()  //构建verity table ,设置分区读写属性等

        

上面提到LoadAndVerifyVbmetaByPath失败的原因有:

  • waitforfile fail
  • open fail
  • VerifyVBMetaData: 这里校验的依据有:
    • footer
    • offset
    • data_size等等

入口点:system/vold/vdc.cpp

int main(int argc, char** argv) 
    VoldNativeService::mountFstabfscrypt_mount_metadata_encrypted()
        mount_via_fs_mgr(const char* mount_point, const char* blk_device, bool needs_encrypt)
            fs_mgr_do_mount()
                    fs_mgr_do_mount_helper()
                        SetUpStandaloneAvbHashtree()

有两个时机会运行fscrypt_mount_metadata_encrypted(),

  • VoldNativeService::mountFstab //本处以此为例
  • VoldNativeService::encryptFstab

挂载流程分析

分区挂载相关

main(int argc, char** argv)
	//agrv[1]==second
    SecondStageMain(int argc, char** argv)
    
    
    //agrv[1]==first
    FirstStageMain(int argc, char** argv)
        DoFirstStageMount(bool create_devices)
        	IsRecoveryMode() // access("/system/bin/recovery", F_OK)
            FirstStageMount::Create();
        	DoCreateDevices()
            FirstStageMount::DoFirstStageMount()
                IsDmLinearEnabled() && fstab_.empty()  //相关属性检查
                FirstStageMount::MountPartitions()
                    TrySwitchSystemAsRoot()
                        MountPartition(system_partition, false /* erase_same_mounts */) //先挂载system分区,挂载失败,直接返回
                        SwitchRoot("/system");  //system as root
                    SkipMountingPartitions() //一些跳过mount的分区,如GSI下几句跳过system-ext/product
                    MountPartition(current, false /* erase_same_mounts */, &end))
                        SetUpDmVerity(&(*begin))
                            if(!fstab_entry->avb_keys.empty())
                                if(avb-handle = disable/error) //return true 直接挂载镜像
                                else 
                                    AvbHandle::LoadAndVerifyVbmeta(*fstab_entry, preload_avb_key_blobs_[])
                                      LoadAndVerifyVbmetaByPath(stab_entry.blk_device, "" ,""  , allow_verification_error, rollback_protection,false , &public_key_data, &verification_disabled, &verify_result);
                                          WaitForFile((image_path, 1s))
                                          open(image_path.c_str(), O_RDONLY | O_CLOEXEC)
                                          VerifyVBMetaData()
                                    SetUpAvbHashtree(fstab_entry, false /* wait_for_verity_dev */);
                                	BlockDevInitializer::InitDmDevice(const std::string& device)
                            else if (fstab_entry->fs_mgr_flags.avb)
                                 if (!InitAvbHandle()) return false;
                                 hashtree_result =avb_handle_->SetUpAvbHashtree()                                        
                    fs_mgr_mount_overlayfs_fstab_entry(entry); // fs-type = overlay
                	GetRootEntry(&root_entry) //如fstab中没有/system或者/ ,就创建一个入口
                    block_dev_init_.InitDmDevice(*iter) //Creates "/dev/block/dm-XX" for dm nodes by running coldboot on /sys/block/dm-XX.
                    fs_mgr_overlayfs_mount_all(&fstab_)
                        fs_mgr_mount_point(entry.mount_point);
                        	fs_mgr_overlayfs_already_mounted(mount_point)
                        fs_mgr_overlayfs_mount(entry)

驱动部分

module_init(dm_verity_init)
    dm_register_target(&verity_target);

static struct target_type verity_target = {
	.name		= "verity",
	.features	= DM_TARGET_IMMUTABLE,
	.version	= {1, 5, 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,
};
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
verity_map(struct dm_target *ti, struct bio *bio)
    verity_end_io(struct bio *bio)
        INIT_WORK(&io->work, verity_work);  //
            verity_work()
                verity_finish_io(io, errno_to_blk_status(verity_verify_io(io))) //errno_to_blk_status->blk-core.c 功能未知
                    verity_verify_io(struct dm_verity_io *io)
                        *bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size);
                            for(::) //对每一个n_blocks
                                verity_hash_for_block(v, io, cur_block,verity_io_want_digest(v, io),&is_zero);
                                    verity_verify_level()
                                        verity_hash(v, verity_io_hash_req(v, io), data, 1 << v->hash_dev_block_bits, verity_io_real_digest(v, io))
                                        likely(memcmp(verity_io_real_digest(v, io), want_digest, v->digest_size) == 0)
                                        verity_fec_decode(v, io, DM_VERITY_BLOCK_TYPE_METADATA, hash_block, data, NULL)
                                        verity_handle_err(v, DM_VERITY_BLOCK_TYPE_METADATA, hash_block)  //经过verity-hash/ 比较digest/ fec纠错后都失败,处理错误块
    verity_fec_init_io(io);
    verity_submit_prefetch(v, io);
    generic_make_request(bio);
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值