现在的位置: 首页 > 综合 > 正文

android vold

2013年05月21日 ⁄ 综合 ⁄ 共 3150字 ⁄ 字号 评论关闭

vold.c

function main:

/*

这个函数主要是load vold的config文件/system/etc/vold.conf , 然后查看一下config文件里的东西有没已经mount起来

*/

volmgr_bootsrap();

{

/*

load config文件, 以volume_udisk结果为单位做成一个链表

*/

volmgr_readconfig("/system/etc/vold.conf");

/*

check mount point, 读文件/proc/mounts 与config文件的mount_point对比一下即可

读/proc/mounts 时有个sscan函数的用法要理解:就是%s 并不是遇到结束符才返回,遇到空格就可返回

*/

 volume_t *v = vol_root;
    while (v) {
        if (_mountpoint_mounted(v->mount_point)) {
            LOGW("Volume '%s' already mounted at startup", v->mount_point);
            v->state = volstate_mounted;
        }
        v = v->next;
    }
}

/*

挂载现有的mmc设备。

思路是找到设备注册的目录,在/sys/class/mmc_host/下,没有设备的情况是只有文件(event subsystem power device)

有设备的情况是 :如  /sys/class/mmc_host/mmc2/mmc2:0001

*/

mmc_bootstrap()

{

/*

构建uevent_params, 调用 simulate_uevent: MMC_TYPE= ; MMC_NAME= ;  path= ;

*/

simulate_uevent("mmc", devpath, "add", uevent_params);

/*

这函数最终调用 handle_mmc_event

*/

handle_mmc_event()

{

/*

add remove 一个media

typedef struct media {
    char           *devpath;
    char           *name;
    uint32_t       serial;
    media_type_t   media_type;

    blkdev_list_t  *devs;
} media_t;

*/

}

/*

后面的检查分区类似

*/

}

while(1)

{

/*

接收及发送message

*/

 {
       ········
        FD_ZERO(&read_fds);//初始化文件描述集合
        FD_SET(door_sock, &read_fds);//将door_sock加入文件描述集
        if (door_sock > max)
            max = door_sock;
        FD_SET(uevent_sock, &read_fds);//将event_sock加入文件描述集
        if (uevent_sock > max)
            max = uevent_sock;
        if (fw_sock != -1) {
            FD_SET(fw_sock, &read_fds);//将fw_sock加入文件描述集
            if (fw_sock > max)
                max = fw_sock;
        }
       //当所有的文件描述符都没改变时,阻塞线程
        if ((rc = select(max + 1, &read_fds, NULL, NULL, &to)) < 0) {
            LOGE("select() failed (%s)", strerror(errno));
            sleep(1);
            continue;
        }
        if (!rc) {
            continue;
        }
        //检测如果是door_sock,检测与framework的连接,并发送msg
        if (FD_ISSET(door_sock, &read_fds)) {
            struct sockaddr addr;
            socklen_t alen;
            alen = sizeof(addr);
            if (fw_sock != -1) {
                LOGE("Dropping duplicate framework connection");
                int tmp = accept(door_sock, &addr, &alen);
                close(tmp);
                continue;
            }
            if ((fw_sock = accept(door_sock, &addr, &alen)) < 0) {
                LOGE("Unable to accept framework connection (%s)",
                     strerror(errno));
            }
            LOG_VOL("Accepted connection from framework");

            if ((rc = volmgr_send_states()) < 0) {
                LOGE("Unable to send volmgr status to framework (%d)", rc);
            }
        }
        //如果是fw_sock,执行framework传来的命令
        if (FD_ISSET(fw_sock, &read_fds)) {
            if ((rc = process_framework_command(fw_sock)) < 0) {
                if (rc == -ECONNRESET) {
                    LOGE("Framework disconnected");
                    close(fw_sock);
                    fw_sock = -1;
                } else {
                    LOGE("Error processing framework command (%s)",
                         strerror(errno));
                }
            }
        }
      //如果是uevent_sock,产生一个uevent事件
        if (FD_ISSET(uevent_sock, &read_fds)) {
            if ((rc = process_uevent_message(uevent_sock)) < 0) {
                LOGE("Error processing uevent msg (%s)", strerror(errno));
            }
        }
    } // while

}

/*

android 本身只支持mmc ,没有udisk, 加udisk时参考mmc.c 即可。

但应该注意是否有mmc的设备被mount起

*/

抱歉!评论已关闭.