天天看點

Android SD Mount

1、mount挂載

Android SDcard熱插拔監測和執行操作是由一個啟動檔案vold所統領的,系統開機會讀取初始化配置檔案init.rc。

usbdisk或者sdcard熱插拔的時候,kernel會發出指令執行mount或者unmount操作,但這都是驅動級的。而mount目錄會在android的檔案系統目錄下,/dev/block/vold這個目錄由vold生成,用來存放所有的usbdisk或者sdcard的挂載點。

可以根據這個目錄(/dev/block/vold/)找到如下節點:

179:0    179:1    8:0    8:1    8:2    8:3    8:4

節點的小介紹:0代表目前的整個裝置,1代碼目前裝置的分區名稱代号。是以你會發現,sdcard隻有一個分區它卻生成了兩個如:179:0  179:1;而usbdisk有四個分區,它會生成五個挂載點:8:0  8:1  8:2  8:3  8:4,就是這個原因。

2、vold.fstab配置檔案的分析

假如有以下配置檔案:

dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1

dev_mount代表挂載格式;sdcard代表挂載的标簽;/mnt/sdcard代表挂載點;auto為自定義選項,可以為任何,但必須在main裡面自己判斷比如這裡的意思為自動挂載;後面兩個目錄為裝置路徑,第一個如果被占用會選擇第二個。

3、主動挂載和手動挂載

主動挂載(插入SDcard或者USB硬碟時系統自動挂載)

手動挂載(解除安裝SDcard或者USB硬碟後,再點選加載裝置的手動挂載)

不同挂載走的流程并不相同,比如手動挂載是由上層發指令給vold執行挂動作,而主動挂載是由kernel發指令給vold再由vold發挂載消息給上層,上層得到挂載消息和狀态後再發指令給vold執行挂載。主動挂載較之複雜些。不過雖然流程不一樣,但最終還是要調用Volume的挂載函數。

4、

MountService:實作用于管理儲存設備的背景服務。

StorageManage:通路MountService接口,并向應用層提供接口。

NativeDaemonConnector:建立socket實作mountservice和vold的通信。