Android Vold 架构简析

article/2025/10/2 18:35:52

这篇文章中主要是分析一下,android系统里面的Vold——Vold是andorid系统的设备管理器,扮演着linux里面的udev的角色。它通过监听uevent的端口,取得

uevent事件,dispatch到 相应的Listener,执行相应的动作。

UEvent

在linux平台上,uevent给系统软件提供设备事件,设备节点的权限管理等等,它由kernel发出。通过socket与udev守护进程通讯(systemd-udevd.service), 在sysfs下的很多kobject下都有uevent属性,它主要用于内核与udev(自动设备发现程序)之间的一个通信接口,应用软件,也可以直接使用该uevent文件做作为一个驱动接口。uevent是具有一定格式的字符串,包含一些内容,如:action: {add, change, remove,} devpath设备节点号{major,minor}等。通过对uevent的解析,就能得到kernel发生了那些设备事件。

使用manudev可以得到更多关于udev的信息。

下面是我从kernel的readme文件里面,找的两个uevent例子。

1.)Path failure.

    UEVENT[1192521009.711215]change@/block/dm-3

    ACTION=change

    DEVPATH=/block/dm-3

    SUBSYSTEM=block

    DM_TARGET=multipath

    DM_ACTION=PATH_FAILED

    DM_SEQNUM=1

    DM_PATH=8:32

    DM_NR_VALID_PATHS=0

    DM_NAME=mpath2

    DM_UUID=mpath-35333333000002328

    MINOR=3

    MAJOR=253

    SEQNUM=1130

2.)Path reinstate.

    UEVENT[1192521132.989927]change@/block/dm-3

    ACTION=change

    DEVPATH=/block/dm-3

    SUBSYSTEM=block

    DM_TARGET=multipath

    DM_ACTION=PATH_REINSTATED

    DM_SEQNUM=2

    DM_PATH=8:32

    DM_NR_VALID_PATHS=1

    DM_NAME=mpath2

    DM_UUID=mpath-35333333000002328

    MINOR=3

    MAJOR=253

    SEQNUM=1131

VoldListen and Dispatch

Vold的工作流程比较简单,开机后它主要是启动了2个Listener:CommandListener,NetlinkManager,它们针对监听的内容进行了过滤,所以不会出现“打架”的情况。拿到uevent事件后,分别dispatch到自己的下级模块。大部分的工作都是统一到VolumeManager里面来处理的。

下面举一个插入U盘的例子。

    1)NetlinkManager监听到事件后,通过NetlinkHandlerdispatch到VolumeManager.handleBlockEvent函数。

    2)如果系统里面还没有设备节点,则创建一个。

        mknod(device,mode, dev) ,创建的设备文件: /dev/block/vold/8:1 

    3)得到uuid号.

        getVolumeUUID(),本例的结果是1E37-C6B3

    4)生成DirectVolume对象,反馈信息到kernel.

        mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeDiskInserted, )

       反馈VolumeDiskInserted到kernel.

    5)CommandListener监听到uevent事件,dispatch到VolumeCmd.

         VolumeCmd::runCommand --> rc = vm->mountVolume(argv[2]);

         Volume::mountVol()

         Ntfs::doMount(devicePath,"/mnt/secure/staging", fals,)

         doMount结束后,U盘被mount到了/mnt/usb/sda1,可以被正常使用。

Coldboot

这个功能利用uevnet文件作为与驱动层的接口,直接写入add事件,达到重新初始化的目的。

我们也可以利用这个特性来,初始化一些设备。

coldboot("/sys/block");

fd= openat(dfd, "uevent", O_WRONLY);

write(fd,"add\n", 4); ——代码里面通过递归,写了/sys/block目录下,所有的uevent文件。

配置

路径:一般情况下是device/路径下的fstab文件,如fstab.xx文件。它在init.rc文件里面被include。

on fs

    .....

    mount_all/fstab.xx

init解析该文件后,会做system/core/init/builtins.c::do_mount_all.顾名思义,会mount文件里面配置的设备。

格式:<src>  <mnt_point>  <type>  <mnt_flags>  <fs_mgr_flags>

  • src:sysfs下面的设备文件路径。

  • fs_mgr_flags:这个不太好理解,官网上的解释是:“Voldignores any lines in the unified fstab that do not include thevoldmanaged= flag in this field. Thisflag must be followed by a label describing the card, and apartition number or the wordauto. Hereis an example:voldmanaged=sdcard:auto.Other possible flags arenonremovable,encryptable=sdcard, andnoemulatedsd." ——说实在的,也看不太明白。当不明白的时候,代码是最好的解释。

    我搜索了一下代码(system/core/fs_mgr/fs_mgr.c):

    if(fstab->recs[i].fs_mgr_flags & MF_WAIT)

    wait_for_file(fstab->recs[i].blk_device,WAIT_TIMEOUT);

    WAIT标志位,就是等待设备文件(<src>)的是否创建。如:

          /dev/block/platform/xxxx /system ext4 ro wait

         mount/system的时候,会等待"/dev/block/platform/xxxx"这个文件,系统初始化是一个异步处 理过程, 执行到这一步的时候,

           需要waitmount所需要的资源已经足够。

          if(fstab->recs[i].fs_mgr_flags & MF_CHECK)

              check_fs(fstab->recs[i].blk_device,fstab->recs[i].fs_type,

    CHECK标志位,表示需要检查EXT2/3/4文件系统。

         if((fstab->recs[i].fs_mgr_flags & MF_CRYPT)

               mount("tmpfs",fstab[i].mnt_point,"tmpfs",

    CRYPT标志位,表示mounttmpfs文件系统。

SDCard

SD卡,在andorid系统上面不同于U盘,它有个特殊的地方:App会存储它的数据到主SD卡里面。如果在initrc文件里面,做了下面类似的配置:

exportEXTERNAL_STORAGE /storage/sdcard0

Andorid系统会使用/storage/sdcard0,做为App的数据存储卡。会对该SD卡做一些安全处理,使得每个App只能访问自己的目录,而不能去随意访问别人的目录。

也可以配置使用内部的存储器(Flash)来模拟主SDCard,类似下面的配置。

exportEXTERNAL_STORAGE /storage/emulated/legacy

exportEMULATED_STORAGE_SOURCE /mnt/shell/emulated

export EMULATED_STORAGE_TARGET /storage/emulated

on fs

    setprop ro.crypto.fuse_sdcard true

    service sdcard /system/bin/sdcard -u 1023 -g 1023 -l

     /data/media /mnt/shell/emulated
 

不同的系统,估计会有一些差异。

---
欢迎大家来我的公众号交流: 般若程序蝉

 


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

相关文章

Android Vold架构

1. 总体架构 2. 流程概览 2.1 开启Vold 2.2 引导Uevent 2.3 处理事件 Vold - Volume Daemon存储类的守护进程&#xff0c;作为Android的一个本地服务&#xff0c;负责处理诸如SD、USB等存储类设备的插拔等事件。 1. 总体架构 Vold服务由volumeManager统一管控&#xff0c…

Vold 流程介绍

文章目录 前言框架MountService 流程Vold 流程 前言 印象中是参考 《深入理解 Android 卷 1 》 追的流程&#xff0c;差不多供参考吧 基于安卓 4.4 框架 MountService 流程 /*【初始化流程总结】&#xff1a; SystemServerinitAndLoop()// 创建 MountService 服务对象mountS…

ANDROID中的VOLD分析

现在可能很少有人会用mknod这个命令了&#xff0c;也很少有使用它的机会&#xff0c;但就在几年前&#xff0c;这还是一项linux工程师的必备技能&#xff0c;在制作文件系统前或加载新的驱动前&#xff0c;我们必须小心翼翼的创建设备节点。 不需要使用mknod并不是他消失了&am…

Android -- Vold机制简要分析

Android -- Vold机制简要分析 Vold是用于管理和控制Android外部存储介质的后台进程&#xff0c;这里说的管控&#xff0c;主要包括SD卡的插拔、挂载/卸载和格式化等&#xff1b;它是Android平台外部存储系统的管控枢纽。 Vold的整个控制模块主要由三个类模块构成&#xff1a;Ne…

Android Vold简介(一)

Vold(volume Daemon)&#xff0c;即Volume守护进程&#xff0c;用来管理Android中存储类的热拔插事件&#xff0c;处于Kernel和Framework之间&#xff0c;是两个层级连接的桥梁。先来看一下Vold在Android系统的整体架构。 该图主要包含了Framework和Vold进程的&#xff0c;Ke…

vold

一、Vold工作机制 Vold是Volume Daemon的缩写&#xff0c;它是Android平台中外部存储系统的管控中心&#xff0c;是管理和控制Android平台外部存储设备的后台进程。其功能主要包括&#xff1a;SD卡的插拔事件检测、SD卡挂载、卸载、格式化等。 如上图所示&#xff0c;Vold中的…

Vold工作流程分析学习

一 Vold工作机制分析 vold进程&#xff1a;管理和控制Android平台外部存储设备&#xff0c;包括SD插拨、挂载、卸载、格式化等&#xff1b; vold进程接收来自内核的外部设备消息。 Vold框架图如下&#xff1a; Vold接收来自内核的事件&#xff0c;通过netlink机制。 Netlink 是…

Android vold介绍

目录 1. 前言2. vold概述3. vold初始化|- -vm->start()|- -process_config|- -hardware::configureRpcThreadpool|- -vold::VoldNativeService::start|- -nm->start() 4. StorageManagerService|- -SM与vold建立关联|- - -startService(serviceClass) |- -StorageManager…

<Android开发> Android vold - 第一篇 vold前言简介

本系列主要介绍 Android vold&#xff0c;分为以下篇章 &#xff1c;Android开发&#xff1e; Android vold - 第一篇 vold前言简介 &#xff1c;Android开发&#xff1e; Android vold - 第二篇 vold 的main()函数简介 &#xff1c;Android开发&#xff1e; Android vold - 第…

Vold原理介绍

一、 Vold简介 Android中Vold是volume Daemon&#xff0c;即Volume守护进程&#xff0c;用来管理Android中存储类的热拔插事件。这里的热插拔涉及的场景如&#xff1a; 1. 手机usb以MTP或者传输照片方式插拔PC端后磁盘数据的挂卸载&#xff1b; 2. 设备开关机过程中存储设备各分…

C语言Switch....case用法

概述 C语言switch语句通常用于多个条件判断&#xff0c;根据不同情况执行不同的代码块。它的使用形式如下&#xff1a; switch&#xff08;表达式&#xff09; { case 常量表达式1&#xff1a; 语句序列1 break; case 常量表达式2&#xff1a; 语句序列2 break; ...... default…

MySQL 入门:Case 语句很好用

引言 MySQL CASE 是一个 MySQL 语句查询关键字&#xff0c;它定义了处理循环概念以执行条件集并使用 IF ELSE 返回匹配案例的方式。 MySQL 中的 CASE 是一种控制语句&#xff0c;它验证条件案例集&#xff0c;并在第一个案例满足 else 值时显示值并退出循环。 如果没有找到 T…

Shell 编程之 case 语句

一、case 语句 1、case 语句概述 (1)case 语句的作用 使用 case 语句改写 if 多分支可以使脚本结构更加清晰、层次分明。针对变量的不同取 值&#xff0c;执行不同的命令序列。 2、case 语句的结构: case 变量值 in 模式 1) 命令序列 1 ;; 模式 2) 命令序列 2 ;; *…

【shell】case实现简单的系统工具箱

case实现简单的系统工具箱 case实现简单的系统工具箱 #!/usr/bin/bash #system manage #by racon 2020-04-19menu() {cat <<-EOF########################################## h. help ## f. disk partition ## d. filesystem mount ## m. memory ## u. system lo…

SQL CASE语句的使用

SQL CASE语句的使用 CASE是一个控制流语句&#xff0c;其作用与IF-THEN-ELSE语句非常相似&#xff0c;可根据数据选择值。 CASE语句遍历条件并在满足第一个条件时返回值。 因此&#xff0c;一旦条件成立&#xff0c;它将短路&#xff0c;从而忽略后面的子句并返回结果。 正如我…

数据库 case 用法

【转载】:数据库中case when 的用法 CASE WHEN 及 SELECT CASE WHEN的用法Case具有两种格式。简单Case函数和Case搜索函数。 1.简单Case函数 CASE sex WHEN 1 THEN 男 WHEN 2 THEN 女 ELSE 其他 END 2.Case搜索函数 CASE WHEN sex 1 THEN 男 WHEN sex 2 THEN 女 ELSE 其他 …

SQL之CASE WHEN用法详解

简单CASE WHEN函数&#xff1a; CASE SCORE WHEN A THEN 优 ELSE 不及格 END CASE SCORE WHEN B THEN 良 ELSE 不及格 END CASE SCORE WHEN C THEN 中 ELSE 不及格 END 等同于&#xff0c;使用CASE WHEN条件表达式函数实现&#xff1a; CASE WHEN SCORE A THEN 优WHEN SCORE…

switch case语法

文章目录 switch case组合不要拿青龙偃月刀去削苹果case的作用是什么&#xff1f;break的作用是什么&#xff1f;case后面的值有什么要求吗&#xff1f;case语句的排列顺序问题default语句相关问题使用case语句的一些注意事项 switch case组合 基本语法结构 switch(整型常量/…

SQL中case的使用方法

Case具有两种格式。简单Case函数和Case搜索函数。 1.简单Case函数 CASE sex WHEN 1 THEN 男WHEN 2 THEN 女 ELSE 其他 END2.Case搜索函数 CASE WHEN sex 1 THEN 男WHEN sex 2 THEN 女ELSE 其他 END3.简单case函数 VS case搜索函数 这两种方式&#xff0c;可以实现相同的功…

[转载]常用CASE工具介绍

[转载]常用CASE工具介绍转载自&#xff1a;http://www.cnblogs.com/powerlc/archive/2006/01/12/315959.html 一&#xff0c;概述 今天, 代码变得日益简单, 在Model的指导下, 思想, 设计, 分析都变得异常重要。企业业务建模工具, 产品非常多, 特别是在MDA日益流行的今天. Work…