vold/mountservice框架

一、进程启动和配置文件的分析
 
    vold的全称是volume daemon。实际上是负责完成系统的CDROM, USB大容量存储,MMC卡等扩展存储的
   挂载任务自动完成的守护进程。它提供的主要特点是支持这些存储外设的热插拔。在Android上的这个
   vold系统和GNU/Linux的之间存在很大的差异,这里主要是分析Android上的vold系统的处理过程。
    自Android 2.2开始,vold又做了大改动,升级为vold 2.0,之前的配置文件是
           system/etc/vold.conf,vold 2.0变为system/etc/vold.fstab。
 
    1、启动vold
   
        在init.rc中启动VOLD这个守护线程和创建socket的命令如下:
        service vold /system/bin/vold
               socket vold stream 0660 root mount
               ioprio be 2
         
    2、配置vold.fstab
   
        vold.fstab文件的格式是:
        Format:  dev_mount  
二、控制流程分析
 
    Vold关于SD card settings的代码位于:
        packages/apps/Settings/src/com/android/settings/deviceinfo/Memory.java
    Vold上层MountService的代码位于:
        frameworks/base/services/java/com/android/server/MountService.java
    Vold底层处理的代码位于:
        system/vold/
       
    1、Vold设计架构
       
        Setting
          |
        MountService
          |
        CommandListener
          |
        VolumeManager    NetlinkManager
          |
        Volume      DirectVolume
          |
        SD/USB device
       
        MountService会接收来之Setting的变化,及来自底层VolumeManager的信息,并对之分析判,然后
       通过doMountVolume命令到底层。
        Vold初始化时,会创建class NetlinkManager和VolumeManager,class NetlinkManager接收
        来自底层的信息,然后传交给VolumeManager处理;
        重要类class VolumeManager 仅有一个实例,它主要负责vold的管理操作,管理多个sd卡,usb各种
    操作;重要类class Volume 可有多个实例, 挂载多少个sd卡、usb,它就有多少个。重要类class
       DirectVolume 封装了很多的方法和属性;重要类class CommandListener主要收到上层
       MountService通过doMountVolume发来的命令,分析后,转交给VolumeManager处理;
        VolumeManager处理信息后,或报告给上层MountService,或交给volume执行具体操作(挂载
       SD,USB).           
       
    2、Vold代码实现过程大致分为三步:
   
        1).创建链接:
          在vold作为一个守护进程,一方面接受驱动的信息,并把信息传给应用层;另一方面接受上层的命令并
         完成相应操作。
          所以这里的链接一共有两条:
          (1)vold socket: 负责vold与应用层的信息传递;
          (2)访问udev的socket: 负责vold与底层的信息传递;
          这两个链接都是在进程的一开始完成创建的。
 
        2).引导:
          这里主要是在vold启动时,对现有外设存储设备的处理。首先,要加载并解析vold.fstab,
          并检查挂载点是否已经被挂载(注:这里检查挂载点的用意不是很清楚!);其次,执行MMC卡挂
         载;  最后,处理USB大容量存储。
 
        3).事件处理:
          这里通过对两个链接的监听,完成对动态事件的处理,以及对上层应用操作的响应。
 
【收藏】以下出自 http://blog.youkuaiyun.com/gzshun/ 
Vold是Android系统处理磁盘的核心部分,取代了原来Linux系统中的udev,主要用来处理Android系统的热插拔存储设备。在Android2.2以后的系统中,vold源码已经移到了system目录下,vold目录包含以下源码:
├── Android.mk
├── Asec.h
├── CleanSpec.mk
├── CommandListener.cpp
├── CommandListener.h
├── Devmapper.cpp
├── Devmapper.h
├── DirectVolume.cpp
├── DirectVolume.h
├── Fat.cpp
├── Fat.h
├── hash.h
├── logwrapper.c
├── Loop.cpp
├── Loop.h
├── main.cpp
├── NetlinkHandler.cpp
├── NetlinkHandler.h
├── NetlinkManager.cpp
├── NetlinkManager.h
├── Process.cpp
├── Process.h
├── ResponseCode.cpp
├── ResponseCode.h
├── vdc.c
├── VoldCommand.cpp
├── VoldCommand.h
├── Volume.cpp
├── Volume.h
├── VolumeManager.cpp
├── VolumeManager.h
├── Xwarp.cpp
└── Xwarp.h


先简要说明一下类的继承关系,vold中比较重要的有以下几个类:
三大管理类:VolumeManager,CommandListener,NetlinkManager
其他处理类:Volume,DirectVolume,NetlinkHandler,Fat,ResponseCode
其他相关的类:NetlinkListener,SocketListener

1.VolumeManager管理Volume类;
2.DirectVolume类继承于Volume类,保存着磁盘信息与操作函数;
3.NetlinkManager类负责与内核uevent事件通信,期间,使用到了NetlinkListener和SocketListener类的函数;
4.Fat是格式化sd卡的函数;
5.ResponseCode保存着vold向framework反馈的值。
 StorageManager为Client,MountService是Server,通过AIDL进行进程间通信。
        MountService是一个Android Service,由systemserver启动。
      Volume Daemon(Vold)是一个Native Service,有Init.c读取init.rc后启动。
      MountService和Vold之间通过Socket通信。
      NativeDaemonConnector帮助MountService取得Vold的socket,建立通信。
      Vold通过NetLink读取Kernel的uevent.
      NetLinkManager帮助Vold建立与kernel间的通信
注:对于上图,我准备分以下几个方面阐述:
可以看到IMountService 中的Stub继承Binder和IMountService
看过源代码,我们不难发现上图中对应的角色:
Client ------ StorageManager
Proxy ------ IMountServie.Stub.Proxy
Parcel ------对象序列化类,数据只有继承Parcelable才能进行RPC
Stub ------ IMountService.Stub
Server ------ MountService
当StorageManager调用MountService方法时,例如调用 registerListener,步骤如下:
  进入IMountServie.Stub.Proxy找到对应的方法 registerListener。
  IMountServie.Stub.ProxyregisterListener利用Parcel将函数调用的序列化为android理解的结构
  调用onTransact函数,onTransact根据参数,找到对应registerListener Switch-case语句执行
  数据通过Binder机制进行写操作,客户端调用阻塞,等待服务端reply
  服务端处理完request返回
  客户端取回数据
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值