Vold工作流程分析学习

一 Vold工作机制分析

         vold进程:管理和控制Android平台外部存储设备,包括SD插拨、挂载、卸载、格式化等;

         vold进程接收来自内核的外部设备消息。

Vold框架图如下:

    

 

         Vold接收来自内核的事件,通过netlink机制。

         Netlink 是一种特殊的 socket;

         Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的socket API 就可以使用 netlink 提供的强大功能;

         Netlink是一种异步通信机制,在内核与用户态应用之间传递的消息保存在socket缓存队列中;

内核通过Netlink发送uEvent格式消息给用户空间程序;外部设备发生变化,Kernel发送uevent消息。

二 Vold进程启动过程
service vold /system/bin/vold
    class core
    socket vold stream 0660 root mount
    ioprio be 2 

三 vold进程执行过程:


         \system\vold\main.cpp
{
        //初始化Vold相关的类实例 single
        vm = VolumeManager::Instance();

        nm = NetlinkManager::Instance();

        cl = new CommandListener(); //CommandListener 创建vold socket监听上层消息

        vm->setBroadcaster((SocketListener *) cl);
        nm->setBroadcaster((SocketListener *) cl);
        
        //启动VolumeManager 
        vm->start();

        //根据配置文件/etc/vold.fstab 初始化VolumeManager 
        process_config(vm);
//启动NetlinkManager socket监听内核发送uevent
        nm->start();
//向/sys/block/目录下所有设备uevent文件写入“add\n”,
        //触发内核sysfs发送uevent消息
        coldboot("/sys/block");
        
        //启动CommandListener监听vold socket
        cl->startListener();
}
1 NetlinkManager模块
  NetlinkManager模块接收从Kernel发送的Uevent消息,解析转换成NetlinkEvent对象;再将此NetlinkEvent对象传递给VolumeManager处理。
NetlinkHandler::onEvent(NetlinkEvent *evt) 


2 VolumeManager模块
  此模块管理所有挂载的设备节点以及相关操作执行;下面是VolumeManager模块类结构图:


从NetlinkManager到VolumeManager代码过程
(vm->start())
VolumeManager::handleBlockEvent(NetlinkEvent *evt)  //函数执行从onEvent到handleBlockEvent:
  
DirectVolume::handleBlockEvent(NetlinkEvent *evt)  //这里的Volume为其派生类DirectVolume。
 
3 CommandListener接收到来自Framework层得消息,派发命令处理,再传递给VolumeManager处理。

CommandListener监听Socket,使Vold与Framework层进行进程通信;

其相关类继承结构图如下:


CommandListener实例的创建:构造函数

         CommandListener构造函数:

CommandListener::CommandListener() :  //注册Framework发送的相关命令 Command模式
                 FrameworkListener("vold", true) {
    registerCmd(new DumpCmd());
    registerCmd(new VolumeCmd());
    registerCmd(new AsecCmd());
    registerCmd(new ObbCmd());
    registerCmd(new StorageCmd());
    registerCmd(new XwarpCmd());
    registerCmd(new CryptfsCmd());
}


Command执行处理:以VolumeCommand为例 
//获取VolumeManager实例
1.   VolumeManager *vm = VolumeManager::Instance();
    //Action判断 传递给VolumeManager处理
.
.
2.    } else if (!strcmp(argv[1], "mount")) {
        rc = vm->mountVolume(argv[2]);
.
3.VolumeManager中Action处理:
int VolumeManager::mountVolume(const char *label) {

整个Vold处理过程框架图如下:

    

参考:http://www.cnblogs.com/bastard/archive/2012/12/03/2799298.html

ATC 8217
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值