2011年2月23日 星期三

什麼是vold

在Android系統中有個Native Service叫做vold,舊的版本叫做mountd。如果對mountd有興趣的話可以在Cupcake找到Source Code。在Donut以後的版本Mountd已經從目錄結構中移除了,只有在init.rc中可以看到註解掉的啟動腳本。vold位於User Space,任務是透過netlink接收從Kernel Space送上來的uevent。每一個送上來的uevent在vold的解析後有些會透過UNIX domain socket轉傳給Android Service,也就是MountService。由MountService決定接下來的動作。所以vold配合MountService的架構是用來偵測和處理Android系統中External Storage的掛載,其中External Storage可能是USB Mass Storage或者是SD Card。

00
從[Froyo Root]/system/vold/main.c我們可以發現vold的主要的運作流程。程式的最後會進入無窮迴圈用以分別監聽netlink以及UNIX domain socket,對上對下接收傳遞訊息。程式中會配置兩個Singleton Manager分別用來管理netlink的NetlinkManager以及管理每個External Storage的VolumeManager。另一個UNIX domain socket會藉由init.rc建造並且在程式啟動的時候透過環境變數傳進vold。整個流程也包含重置uevent,以解決vold還沒作用前External Storage就已經被置入的問題。

01

Plurk