Android Vold 架构简析

原创 2016年06月01日 10:48:59

李力琼(joni.kartorz.lee@gmail.com)软件工程师,热爱并致力于Linux平台的开源软件的开发,你可以用email与他联系。本文中Andorid系统的版本为4.3及以上。

-------------------------------------------------------------------------------------------------------------------------------------------


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

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




UEvent


linux平台上,uevent给系统软件提供设备事件,设备节点的权限管理等等,它由kernel发出。通过socketudev守护进程通讯(systemd-udevd.service), 

sysfs下的很多kobject下都有uevent属性,它主要用于内核与udev(自动设备发现程序)之间的一个通信接口,应用软件,也可以直接使用该uevent文件做作为一

个驱动接口。uevent是具有一定格式的字符串,包含一些内容,如:action: {add, change, remove,} devpath设备节点号{major,minor}等。通过对uevent的解析,就

能得到kernel发生了那些设备事件。


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


下面是我从kernelreadme文件里面,找的两个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的工作流程比较简单,开机后它主要是启动了2ListenerCommandListener

NetlinkManager,它们针对监听的内容进行了过滤,所以不会出现“打架”的情况。拿到uevent事件后,分别dispatch到自己的下级模块。大部分的工作都是统一

VolumeManager里面来处理的


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

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


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

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


    3)得到uuid.

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


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

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

       反馈VolumeDiskInsertedkernel.


    5)CommandListener监听到uevent事件,dispatchVolumeCmd.

         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

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



Android vold 工作流程分析

Vold 也即volume Daemon ,是Android存储类的守护进程,管理SD ,USB 等存储类的热拔插事件。 vold 服务总体框架 借用博客http://blog.chinaunix...

Android 7.0 Vold工作流程

Vold是Volume Daemon的缩写,它是Android平台中外部存储系统的管控中心,是管理和控制Android平台外部存储设备的后台进程。其功能主要包括:SD卡的插拔事件检测、SD卡挂载、卸载...

ANDROID中的VOLD分析

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

Android6.0 MountService和vold详解(三) vold SD卡、otg

既上面两篇博客,继续分析vold、对外置SD卡和OTG的分析: 一、process_config函数 上一篇我们再main函数中分析了VolumeManager的start函数,这次我们接下来分析...

Android4.4----Vold挂载管理分析(一)

最近在研究Android4.4的内置SD卡和外置SD卡的挂载问题,看了网上很多大神的博客以及自己做的一些实验,记录下来,以便日后查阅。...

Android vold系统分析

熟悉操作系统的都知道,硬件存储设备如何才能被系统的软件操作,需要将设备节点挂载至相应的挂载点(目录),挂载的时候会有一系列的参数,包括挂载为什么格式的文件系统等,然后标准的文件系统操作就可以控制硬件存...

android usb挂载分析---FrameWork层处理vold消息

从前面的知识我们看到,在vold层收到 FrameWork层的消息后,会进行相应的处理,同时在处理的过程中会上报相应的状态给FrameWork层,在这个过程中主要上报了两种消息: 1、开始挂载前上报...
  • new_abc
  • new_abc
  • 2012年04月01日 00:12
  • 6074

Linux下调整屏幕分辨率

使用的命令:xrandr    cvt  (如果没有则通过相应的安装命令去安装) 查看当前屏幕分辨率列表 xrandr 设置屏幕分辨率 xrandr -s 1920x1080_60.00 一般情况下...

Android-Camera-架构及应用简析

  • 2017年06月01日 15:21
  • 588KB
  • 下载

Android Vold架构

1. 总体架构 2. 流程概览 2.1 开启Vold 2.2 引导Uevent 2.3 处理事件   Vold - Volume Daemon存储类的守护进程,作为Android的一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Vold 架构简析
举报原因:
原因补充:

(最多只允许输入30个字)