您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Android23SD卡挂载流程浅析
Android2.3中关于SD卡挂载简介在Android2.3中,当SD卡插入系统之后,系统会自动挂载。Vold就是负责挂载SD卡的,vold的全称是volumedaemon。实际上是负责完成系统的CDROM,USB大容量存储,MMC卡(后文有简介,具体请百度)等扩展存储的挂载任务自动完成的守护进程。它提供的主要特点是支持这些存储外设的热插拔。在Android上的这个vold系统和GNU/Linux的之间存在很大的差异。自Android2.2开始,vold又做了大改动,升级为vold2.0,之前的配置文件是system/etc/vold.conf,vold2.0变为system/etc/vold.fstab。vold.fstab中的内容显示如下:##Vold2.0Genericfstab##-SanMehat(san@android.com)###########################Regulardevicemount####Format:dev_mountlabelmount_pointpartsysfs_path1...##label-Labelforthevolume##mount_point-Wherethevolumewillbemounted##part-Partition#(1based),or'auto'forfirstusablepartition.##sysfs_path-Listofsysfspathstosourcedevices########################Exampleofastandardsdcardmountfortheemulator/Dream#Mountsthefirstusablepartitionofthespecifieddevicedev_mountsdcard/mnt/sdcardauto/devices/platform/goldfish_mmc.0/devices/platform/msm_sdcc.2/mmc_host/mmc1##Exampleofadualcardsetup#dev_mountleft_sdcard/sdcard1auto/devices/platform/goldfish_mmc.0/devices/platform/msm_sdcc.2/mmc_host/mmc1#dev_mountright_sdcard/sdcard2auto/devices/platform/goldfish_mmc.1/devices/platform/msm_sdcc.3/mmc_host/mmc1##Exampleofspecifyingaspecificpartitionformounts#dev_mountsdcard/sdcard2/devices/platform/goldfish_mmc.0/devices/platform/msm_sdcc.2/mmc_host/mmc1可以看到大部分是注释,最重要的为以下这句:dev_mountsdcard/mnt/sdcardauto/devices/platform/goldfish_mmc.0/devices/platform/msm_sdcc.2/mmc_host/mmc1这句代码意思是:外置SD卡的挂载路径,auto代表挂载SD卡的第一个分区,后面是vold监测的路径,当插入sd时,/devices/platform/msm_sdcc.2/mmc_host/mmc1路径下会多出一个文件夹,在该文件夹中包含了SD卡的各种ID信息,以及生产日期等。如果把sd卡插入设备,在/dev/block/目录下面也会多出几个设备节点,证明sd卡的驱动已经成功加载。我自己测试的目录下面会形成mmcblk0和mmcblk0p1节点,注意:这两个节点的意思,mmcblk0代表第一个SD卡设备,mmcblk0p1代表第一个SD卡设备的第一个分区。真正挂载到系统中的是mmcblk0p1而不是mmcblk0,这一点很重要。PS:MMC(MultiMediaCard)卡由西门子公司和首推CF的SanDisk于1997年推出。1998年1月十四家公司联合成立了MMC协会(MultiMediaCardAssociation简称MMCA),现在已经有超过84个成员。MMC的发展目标主要是针对数码影像、音乐、手机、PDA、电子书、玩具等产品,号称是目前世界上最小的FlashMemory存贮卡,尺寸只有32mmx24mmx1.4mm。虽然比SmartMedia厚,但整体体积却比SmartMedia小,而且也比SmartMedia轻,只有1.5克。MMC也是把存贮单元和控制器一同做到了卡上,智能的控制器使得MMC保证兼容性和灵活性。MMC_百度百科SD/MMC卡的设备构造差不多,不过MMC当时的设计比SD小一半。所以,SD/MMC的驱动通用,进一步的,Linux的设备节点就延续了MMC的这个名字,后面的blk是块设备这个英文的简写,mmcblk也就是“mmc/sd块设备”,0就是这个mmc/sd设备的顺序编号,p1就是第一个分区。挂载流程简析内核层(kernel):当有新的SD/USB设备插入时,kernel将自动检测并加载对应的驱动,同时kernel中的sysfs机制会在有新的驱动加载时给用户层发送相应的event,然后将kernel产生的这些event传递给vold。用户层(user):用户层通过sysfs可以接收来自kernel的uevent,这些收到的信息可以在/sys/block/mmcblk0下用命令cat*来查看,如:#cat*bdi:invalidlength10179:0device:invalidlength8holders:invalidlengthpower:invalidlengthqueue:invalidlength800524288slaves:invalidlength27881386861050000002401040subsystem:invalidlengthMAJOR=179MINOR=0DEVTYPE=diskNPARTS=0#如果这时候在终端输入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卡挂载从底层到上层的表现,因此这里暂不分析。简约流程图如下:在上一篇博文《Android2.3SD卡挂载流程浅析(一)》主要简单的介绍了SD卡的挂载流程。包括了从内核层到用户层事件消息的传递,以及Vold的简介。本文将继续介绍SD卡的挂载,但文中并不会涉及代码的详细分析,因为这部分网上已有资料,我会在文章结尾贴出来供大家参考。本文主要目的是一方面对自己学习这一部分的总结,另一方面希望大家能够指出文中理解错误的地方。1.SD卡挂载流程图SD卡的挂载流程图如下:绿色箭头:表示插入SD卡后事件传递以及SD卡挂载红色箭头:表示挂载成功后的消息传递流程黄色箭头:表示MountService发出挂载/卸载SD卡的命令大家可能对图中突然出现的这么多的名称感到奇怪,这些都是在Android2.3源码中可以找到的,接下来我会为大家一一解释这些类的作用。2.各个文件的主要作用(1)Kernel:这个是系统内核啦。不是我要分析的文件,本文涉及内容不是内核级的哦!(努力学习中...)(2)NetlinkManager:全称是NetlinkManager.cpp位于Android2.3源码位置/system/vold/NetlinkManager.cpp。该类的主要通过引用NetlinkHandler类中的onEvent()方法来接收来自内核的事件消息,NetlinkHandler位于/system/vold/NetlinkHandler.cpp。(3)VolumeManager:全称是VolumeManager.cpp位于Android2.3源码位置/system/vold/VolumeManager.cpp。该类的主要作用是接收经过NetlinkManager处理过后的事件消息。因为我们这里是SD卡的挂载,因此经过NetlinkManager处理过后的消息会分为五种,分别是:block,switch,usb_composite,battery,power_supply。这里SD卡挂载的事件是block。(4)DirectVolume:位于/system/vold/DirectVolume.cpp。该类的是一个工具类,主要负责对传入的事件进行进一步的处理,block事件又可以分为:Add,Removed,Change,Noaction这四种。后文通过介绍Add事件展开。(5)Volume:Volume.cpp位于/system/vold/Volume.cpp,该类是负责SD卡挂载的主要类。Volume.cpp主要负责检查SD卡格式,以及对复合要求的SD卡进行挂载,并通过Socket将消息SD卡挂载的消息传递给NativeDaemonConnector。(6)NativeDaemonConnector:该类位于frameworks/base/services/java/com.android.server/NativeDaemonConnector.java。该类用于接收来自Volume.cpp发来的SD卡挂载消息并向上传递。(7)MountService:位于frameworks/base/services/java/com.android.server/MountService.java。MountService是一个服务类,该服务是系统服务,提供对外部存储设备的管理、查询等。在外部存储设备状态发生变化的时候,该类会发出相应的通知给上层应用。在Android系统中这是一个非常重要的类。(8)StorageManaer:位于frameworks/base/core/java/andriod/os/storage/StorageManager.java。在该类的说明中有提到,该类是系统存储服务的接口。在系统设置中,有Storage相关项,同时Setting也注册了该类的监听器。而StorageManager又将自己的监听器注册到了MountService中,因此该类主要用于上层应用获取SD卡状态。通过上文对各个文件的作用简介,以及整个SD卡的挂载流程图可以知道,Android系统是如何从底层获取SD卡挂载信息的。后文将继续分析程序调用流程图。在前面两篇博文《Android2.3SD卡挂载流程浅析(一)》《Android2.3SD卡挂载流程浅析(二)》中,主要简单介绍了SD卡的挂载流程以及所涉及的关键文件。在《Android2.3SD卡挂载流程浅析(三)》中,将简要介绍Android2.3中Vold的运行机制,并从接收内核uevent开始介绍程序调用流程。1.VoldVold的全称是volumedaemon。主要负责系统对大容量存储设备(USB/SD)的挂载/卸载任务,它是一个守护进程,该进程支持这些存储外设的热插拔。自Android2.2开始,Vold升级为vold2.0,之前的配置文件路径在system/etc/vold.
本文标题:Android23SD卡挂载流程浅析
链接地址:https://www.777doc.com/doc-634553 .html