0下用命令cat 来查看如 cat bdi: invalid length 10 179:0 device: invalid length 8 holders: invalid length power: invalid length queue: invalid length 8 0 0 524288 slaves: invalid length 278 813 8686 1050 0 0 0 0 0 240 1040 subsystem: invalid length MAJOR179 MINOR0 DEVTYPEdisk NPARTS0 如果这时候在终端输入pwd指令大家会发现路径并不是我们之前进入的路径/sys/block/mmcblk0而是/sys/devices/platform/goldfish_mmc.0/mmc_host/mmc0/mmc0:e118/block/mmcblk0。
其中mmc0:e118这个文件是插入SD卡之后生成的文件。
Sysfs传递来的是一个多行的文档vold需要解析这个文档。
Vold将处理之后的事件传递给MountService然后MoutService会将信息进一步处理传递给StorageManager最后我们可以在系统设置界面看到SD卡挂载成功的信息这包括了SD卡的总容量以及可用空间如下图 SD卡的挂载流程大致如此MountServie实际上还会通知PackageManagerService因为这里分析的是SD卡挂载从底层到上层的表现因此这里暂不分析。
简约流程图如下 在上一篇博文《Android 2.3 SD卡挂载流程浅析一》主要简单的介绍了SD卡的挂载流程。
包括了从内核层到用户层事件消息的传递以及Vold的简介。
本文将继续介绍SD卡的挂载但文中并不会涉及代码的详细分析因为这部分网上已有资料我会在文章结尾贴出来供大家参考。
本文主要目的是一方面对自己学习这一部分的总结另一方面希望大家能够指出文中理解错误的地方。
1.SD卡挂载流程图 SD卡的挂载流程图如下 在前面两篇博文《Android 2.3 SD卡挂载流程浅析一》《Android 2.3 SD卡挂载流程浅析二》中主要简单介绍了SD卡的挂载流程以及所涉及的关键文件。
在《Android 2.3 SD卡挂载流程浅析三》中将简要介绍Android 2.3中Vold的运行机制并从接收内核uevent开始介绍程序调用流程。
1. Vold Vold的全称是volume daemon。
主要负责系统对大容量存储设备USB/SD的挂载/卸载任务它是一个守护进程该进程支持这些存储外设的热插拔。
自Android 2.2开始Vold升级为vold 2.0之前的配置文件路径在system/etc/vold.confAndroid 2.3之后变为system/etc/vold.fstab。
2.Vold工作流程 Vold的工作流程大致可以分为三个部分:创建监听、引导、事件处理。
1创建监听 创建监听指的是创建监听链接一方面用于监听来自内核的uevent另一方面用于监听来自上层的控制命令这些命令包括控制SD卡的挂载与卸载这里所说的链接也就是Socket。
在Android 系统启动的时候init进程会去解析init.rc文件在该文件中有如下代码 Service vold /system/bin/vold Socket vold stream 0660 root mount Iprio be 2 这样系统会在启动的时候创建与上层通信的Socket。
在Android 2.3源码/system/vold路径下的main.cpp中创建了与内核通信的Socket。
在main.cpp中通过实例化VolumeManager和NetlinkManager时创建。
2引导 Vold进程启动时候会对现有的外部存储设备进行检查。
首先加载并解析vold.fstab并检查挂载点是否已被挂载。
然后执行SD卡的挂载最后处理USB大容量存储。
因为系统是按行解析的通过查看vold.fstab可以很清楚的知道这一点。
vold.fatab中最重要的语句 dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1 dev_mount 挂载命令 标签 挂载点 子分区个数 挂载路径 注 子分区个数如果为auto则表示只有1个子分区也可以为任何不为0的整数。
参数之间不能有空格只能以tab为间隔注意这里为了对齐因此采用空格隔开如果自行修改vold.fstab之后加以空格的话系统会识别不到的。
如果vold.fstab解析无误VolueManager将创建DirectVolume若vold.fstab解析不存在或者打开失败Vold将会读取Linux内核中的参数此时如果参数中存在SDCARD也就是SD的默认路径VolumeManager则会创建AutoVolume如果不存在这个默认路径那么就不会创建。
3事件处理 通过对两个socket的监听完成对事件的处理以及对上层应用的响应。
a. Kernel发出uevent NetlinkManager检测到kernel发出的uevent解析后调用NetlinkHandler::onEvent方法。
该方法会分别