VOLD:Volume Daemon存储守护进程,用来为响应Usb/SD卡插入,拔出等动作提供服务。
系统启动时,通过解析init.rc文件来启动各种系统服务。
包括VOLD服务也是在这里启动。
service vold /system/bin/vold class core socket vold stream 0660 root mount ioprio be 2
VOLD服务的入口函数system/vold/main.cpp
int main() { VolumeManager *vm; // 管理Volume,实现USB/SD卡Mount,Unmount等动作 CommandListener *cl; // 传递上层Framework向下发送的信息 NetlinkManager *nm; // 响应kernel层传递来的VolumeDiskInserted、VolumeDiskRemoved等信息 mkdir("/dev/block/vold", 0755); /* 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); // Kernel层消息发送到Library后,经过一些列处理,最后通过这个CommandListener将消息发送到vold Socket中 // Application Framework层从vold Socket中取得消息,处理。 nm->setBroadcaster((SocketListener *) cl); if (vm->start()) { // 什么也没做 SLOGE("Unable to start VolumeManager (%s)", strerror(errno)); exit(1); } // 解析vold.fstab // 根据vold.fstab文件,初始化DirectVolume和Volume.cpp实例 if (process_config(vm)) { SLOGE("Error reading configuration (%s)... continuing anyways", strerror(errno)); } // 初始化NetlinkHandler.cpp实例,开始监听kernel层向上发送的消息 if (nm->start()) { SLOGE("Unable to start NetlinkManager (%s)", strerror(errno)); exit(1); } coldboot("/sys/block"); /* * Now that we're up, we can respond to commands */ // 开始监听来自FrameWork层的信息 if (cl->startListener()) { SLOGE("Unable to start CommandListener (%s)", strerror(errno)); exit(1); } // Eventually we'll become the monitoring thread while(1) { sleep(1000); } SLOGI("Vold exiting"); exit(0); }
预计明天开始,以下内容分析
Kernel层向上发送消息处理流程
FrameWork层向下发送消息处理流程