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

本文详细分析了Android 4.4中Vold服务如何处理SD卡挂载的过程,从Vold启动、内核事件接收、SD卡挂载流程到上层应用的通知,逐一解析关键步骤,包括NetlinkHandler、VolumeManager、MountService及 Fat::doMount等组件的作用。
摘要由CSDN通过智能技术生成

这段时间一直在研究内置SD卡和外置SD卡的挂载问题,看了网上jecese关于Android4.2的Vold挂载的博客后,结合自己在Android4.4上做的一些实验,记录下来,以便日后查阅!

一:Vold的启动

关于vold的源码在jb4.4-kikat/system/vold/,根据Android.mk可以知道编译后会生成一个可执行文件vold,并安装到system/bin下。而这个vold会作为一个服务在系统启动的时候去启动它!

在init.rc中

service vold /system/bin/vold
    class core
    socket vold stream 0660 root mount //vold启动的时候创建socket
    ioprio be 2 //这个不是很明白


vold的入口为/system/vold/main.cpp中的main函数

int main() {

    VolumeManager *vm;//这个类主要是接收经NetlinkManager类处理过的消息进行挂载动作
    CommandListener *cl;
    NetlinkManager *nm;//这个类主要通过NetlinkHandler类中的onEvent()方法接收来自kernel发过来的事件信息

    SLOGI("Vold 2.1 (the revenge) firing up");

    mkdir("/dev/block/vold", 0755);//创建/dev/block/vold/存放设备节点

    /* For when cryptfs checks and mounts an encrypted filesystem */
    klog_set_level(6);

    /* Create our singleton managers */
    if (!(vm = VolumeManager::Instance())) {
        SLOGE("Unable to create VolumeManager");
        exit(1);
    };

    if (!(nm = NetlinkManager::Instance())) {
        SLOGE("Unable to create NetlinkManager");
        exit(1);
    };


    cl = new CommandListener();
    vm->setBroadcaster((SocketListener *) cl);
    nm->setBroadcaster((SocketListener *) cl);

    if (vm->start()) {//没有实际操作
        SLOGE("Unable to start VolumeManager (%s)", strerror(errno));
        exit(1);
    }

    if (process_config(vm)) {
        SLOGE("Error reading configuration (%s)... continuing anyways", strerror(errno));
    }

    if (nm->start()) {//创建接收来自kernel信息的socket,实例化NetlinkHandler类,并开启socket检测
        SLOGE("Unable to start NetlinkManager (%s)", strerror(errno));
        exit(1);
    }

    coldboot("/sys/block");//遍历/sys/block下全部的设备信息,并发送一个add事件
//    coldboot("/sys/class/switch");

    /*
     * Now that we're up, we can respond to commands
     */
    if (cl->s
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值