http://www.cnblogs.com/jqyp/archive/2012/01/02/2310077.html
SD card porting
一、進程啟動和配置文件的分析
vold的全稱是volume daemon。實際上是負責完成系統的CDROM, USB大容量存儲,MMC卡等擴展存儲的
掛載任務自動完成的守護進程。它提供的主要特點是支持這些存儲外設的熱插拔。在Android上的這個
vold系統和GNU/Linux的之間存在很大的差異,這里主要是分析Android上的vold系統的處理過程。
自Android 2.2開始,vold又做了大改動,升級為vold 2.0,之前的配置文件是
system/etc/vold.conf,vold 2.0變為system/etc/vold.fstab。
1、啟動vold
在init.rc中啟動VOLD這個守護線程和創建socket的命令如下:
service vold /system/bin/vold
socket vold stream 0660 root mount
ioprio be 2
2、配置vold.fstab
vold.fstab文件的格式是:
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
例如:
dev_mount sdcard /mnt/sdcard 1 /devices/platform/mxsdhci.0/mmc_host/mmc0
自Android 2.2后,SD mount的位置變為/mnt/sdcard。
二、控制流程分析
Vold關於SD card settings的代碼位於:
packages/apps/Settings/src/com/android/settings/deviceinfo/Memory.java
Vold上層MountService的代碼位於:
frameworks/base/services/java/com/android/server/MountService.java
Vold底層處理的代碼位於:
system/vold/
1、Vold設計架構
Setting
|
MountService
|
CommandListener
|
VolumeManager - NetlinkManager
|
Volume - DirectVolume
|
SD/USB device
MountService會接收來之Setting的變化,及來自底層VolumeManager的信息,並對之分析判,然后
通過doMountVolume命令到底層。
Vold初始化時,會創建class NetlinkManager和VolumeManager,class NetlinkManager接收
來自底層的信息,然后傳交給VolumeManager處理;
重要類class VolumeManager 僅有一個實例,它主要負責vold的管理操作,管理多個sd卡,usb各種
操作;重要類class Volume 可有多個實例, 掛載多少個sd卡、usb,它就有多少個。重要類class
DirectVolume 封裝了很多的方法和屬性;重要類class CommandListener主要收到上層
MountService通過doMountVolume發來的命令,分析后,轉交給VolumeManager處理;
VolumeManager處理信息后,或報告給上層MountService,或交給volume執行具體操作(掛載
SD,USB).
2、Vold代碼實現過程大致分為三步:
1).創建鏈接:
在vold作為一個守護進程,一方面接受驅動的信息,並把信息傳給應用層;另一方面接受上層的命令並
完成相應操作。
所以這里的鏈接一共有兩條:
(1)vold socket: 負責vold與應用層的信息傳遞;
(2)訪問udev的socket: 負責vold與底層的信息傳遞;
這兩個鏈接都是在進程的一開始完成創建的。
2).引導:
這里主要是在vold啟動時,對現有外設存儲設備的處理。首先,要加載並解析vold.fstab,
並檢查掛載點是否已經被掛載(注:這里檢查掛載點的用意不是很清楚!); 其次,執行MMC卡掛
載; 最后,處理USB大容量存儲。
3).事件處理:
這里通過對兩個鏈接的監聽,完成對動態事件的處理,以及對上層應用操作的響應
