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變為system/etc/vold.fstab。
vold.fstab中的內容顯示如下:
## Vold 2.0 Generic fstab
## - San Mehat (
[email protected])
##
#######################
## Regular device mount
##
## Format: dev_mount <label> <mount_point> <part> <sysfs_path1...>
## label - Label for the volume
## mount_point - Where the volume will be mounted
## part - Partition # (1 based), or 'auto' for first usable partition.
## <sysfs_path> - List of sysfs paths to source devices
######################
## Example of a standard sdcard mount for the emulator / Dream
# Mounts the first usable partition of the specified device
dev_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_sdcard /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/platform/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 路徑下會多出一個文件夾,在該文件夾中包含了SD卡的各種ID信息,以及生產日期等。
如果把sd卡插入設備,在 /dev/block/ 目錄下面也會多出幾個設備節點,證明sd卡的驅動已經成功加載。 我自己測試的目錄下面會形成 mmcblk0 和 mmcblk0p1 節點,注意:這兩個節點的意思,mmcblk0代表第一個SD卡設備,mmcblk0p1代表第一個SD卡設備的第一個分區。真正掛載到系統中的是mmcblk0p1而不是mmcblk0,這一點很重要。
PS:
MMC(MultiMedia Card)卡由西門子公司和首推CF的SanDisk於1997年推出。1998年1月十四家公司聯合成立了MMC協會(MultiMedia Card Association簡稱MMCA),現在已經有超過84個成員。MMC的發展目標主要是針對數碼影像、音樂、手機、PDA、電子書、玩具等產品,號稱是目前世界上最小的Flash Memory存貯卡,尺寸只有32mm x 24mm x 1.4mm。雖然比SmartMedia厚,但整體體積卻比SmartMedia小,而且也比SmartMedia輕,只有1.5克。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: 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
MAJOR=179
MINOR=0
DEVTYPE=disk
NPARTS=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卡掛載從底層到上層的表現,因此這裡暫不分析。簡約流程圖如下: