android SD卡自動掛載


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).事件處理:
     這里通過對兩個鏈接的監聽,完成對動態事件的處理,以及對上層應用操作的響應


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM