Android23SD卡挂载流程浅析

上传人:博****1 文档编号:555370287 上传时间:2022-07-14 格式:DOCX 页数:77 大小:74.12KB
返回 下载 相关 举报
Android23SD卡挂载流程浅析_第1页
第1页 / 共77页
Android23SD卡挂载流程浅析_第2页
第2页 / 共77页
Android23SD卡挂载流程浅析_第3页
第3页 / 共77页
Android23SD卡挂载流程浅析_第4页
第4页 / 共77页
Android23SD卡挂载流程浅析_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《Android23SD卡挂载流程浅析》由会员分享,可在线阅读,更多相关《Android23SD卡挂载流程浅析(77页珍藏版)》请在金锄头文库上搜索。

1、Android 2.3中关于SD卡挂载简介 在Android 2.3中,当SD卡插入系统之后,系统会自动挂载。Vold 就是负责挂载SD卡的,vold 的全称是volume daemon。实际上是负责完成系统的CDROM,USB 大容量存储,MMC 卡(后文有简介,具体请百度)等扩展存储的挂载任务自动完成的守护进程。它提供的主要特点是支持这些存储外设的热插拔。在Android上的这个vold 系统和GNU/Linux的之间存在很大的差异。自Android 2.2开始,vold又做了大改动,升级为vold 2.0,之前的配置文件是system/etc/vold.conf,vold 2.0变为sy

2、stem/etc/vold.fstab。vold.fstab中的内容显示如下:# Vold 2.0 Generic fstab# - San Mehat (sanandroid )# # Regular device mount# Format: dev_mount # label - Label for the volume# mount_point - Where the volume will be mounted# part - Partition # (1 based), or auto for first usable partition.# - List of sysfs pat

3、hs to source devices# Example of a standard sdcard mount for the emulator / Dream# Mounts the first usable partition of the specified devicedev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1# Example of a dual card setup# dev_mount left_sdca

4、rd /sdcard1 auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1# dev_mount right_sdcard /sdcard2 auto /devices/platform/goldfish_mmc.1 /devices/platform/msm_sdcc.3/mmc_host/mmc1# Example of specifying a specific partition for mounts# dev_mount sdcard /sdcard 2 /devices/p

5、latform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1可以看到大部分是注释,最重要的为以下这句:dev_mount sdcard /mnt/sdcard auto /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 路径下会

6、多出一个文件夹,在该文件夹中包含了SD卡的各种ID信息,以及生产日期等。如果把sd卡插入设备,在 /dev/block/ 目录下面也会多出几个设备节点,证明sd卡的驱动已经成功加载。 我自己测试的目录下面会形成 mmcblk0 和 mmcblk0p1 节点,注意:这两个节点的意思,mmcblk0代表第一个SD卡设备,mmcblk0p1代表第一个SD卡设备的第一个分区。真正挂载到系统中的是 mmcblk0p1而不是mmcblk0,这一点很重要。PS:MMC(MultiMedia Card)卡由西门子公司和首推CF的SanDisk于1997年推出。1998年1月十四家公司联合成立了MMC协会(Mu

7、ltiMedia Card Association简称MMCA),现在已经有超过84个成员。MMC的发展目标主要是针对数码影像、音乐、 、PDA、电子书、玩具等产品,号称 是目前世界上最小的Flash Memory存贮卡,尺寸只有32mm x 24mm x 1.4mm。虽然比SmartMedia厚,但整体体积却比SmartMedia小,而且也比SmartMedia轻,只有1.5克。MMC也是把存贮单 元和控制器一同做到了卡上,智能的控制器使得MMC保证兼容性和灵活性。MMC_百度百科SD/MMC 卡的设备构造差不多,不过 MMC 当时的设计比 SD 小一半。所以,SD/MMC 的驱动通用,进一

8、步的,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下用

9、命令cat *来查看,如:# cat *bdi: invalid length10179:0device: invalid length8holders: invalid lengthpower: invalid lengthqueue: invalid length800524288slaves: invalid length 278 813 8686 1050 0 0 0 0 0 240 1040subsystem: invalid lengthMAJOR=179MINOR=0DEVTYPE=diskNPARTS=0# 如果这时候在终端输入pwd指令,大家会发现路径并不是我们之前进入的路径

10、/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实

11、际上还会通知PackageManagerService,因为这里分析的是SD卡挂载从底层到上层的表现,因此这里暂不分析。简约流程图如下: 在上一篇博文Android 2.3 SD卡挂载流程浅析(一)主要简单的介绍了SD卡的挂载流程。包 括了从内核层到用户层事件消息的传递,以及Vold的简介。本文将继续介绍SD卡的挂载,但文中并不会涉及代码的详细分析,因为这部分网上已有资料,我会 在文章结尾贴出来供大家参考。本文主要目的是一方面对自己学习这一部分的总结,另一方面希望大家能够指出文中理解错误的地方。1.SD卡挂载流程图SD卡的挂载流程图如下:绿色箭头:表示插入SD卡后事件传递以及SD卡挂载 红色箭

12、头:表示挂载成功后的消息传递流程黄色箭头:表示MountService发出挂载/卸载SD卡的命令大家可能对图中突然出现的这么多的名称感到奇怪,这些都是在Android 2.3 源码中可以找到的,接下来我会为大家一一解释这些类的作用。 2.各个文件的主要作用(1)Kernel:这个是系统内核啦。不是我要分析的文件,本文涉及内容不是内核级的哦!(努力学习中.) (2)NetlinkManager:全称是NetlinkManager.cpp位于Android 2.3源码位置/system/vold/NetlinkManager.cpp。该类的主要通过引用NetlinkHandler类中的 onEve

13、nt()方法来接收来自内核的事件消息,NetlinkHandler位于/system/vold/NetlinkHandler.cpp。(3)VolumeManager:全称是VolumeManager.cpp位于Android 2.3源码位置/system/vold/VolumeManager.cpp。 该类的主要作用是接收经过NetlinkManager处理过后的事件消息。因为我们这里是SD卡的挂载,因此经过NetlinkManager处理过后 的消息会分为五种,分别是:block,switch,usb_composite,battery,power_supply。这里SD卡挂载的事件是 b

14、lock。 (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)NativeDae

15、monConnector:该类位于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/storag

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号