<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                在分析Vold的代碼前,先介紹一下Linux系統中的Netlink和Uevent。 1. Netlink的介紹 Netlink是Linux系統中一種用戶空間進程和Kernel進行通信的機制,通過這個機制,位于用戶空間的進程,可接收來自Kernel的一些信息(例如Vold中用到的USB或SD的插拔消息),同時應用層也可通過Netlink向Kernel發送一些控制命令。 目前,Linux系統并沒有為Netlink單獨設計一套系統調用,而是復用了Socket的操作接口,只在創建Socket時會有一些特殊的地方。Netlink的具體使用方法,在進行代碼分析時再來了解,讀者目前只需知道,通過Netlink機制應用層,可接收來自Kernel的消息即可。 2. Uevent介紹 Uevent和Linux的Udev設備文件系統和設備模型有關系,它實際上就是一串字符串,字符串的內容可告知發生了什么事情。下面通過一個實例來直觀感受Uevent: 在SD卡插入手機后(我們這里以SD卡為例),系統會檢測到這個設備的插入,然后內核會通過Netlink發送一個消息給Vold,Vold將根據接收到的消息進行處理,例如掛載這個SD卡。內核發送的這個消息,就是Uevent,其中U代表User space(應用層空間)。下面看SD卡插入時Vold截獲到的Uevent消息。在我的G7手機上,Uevent的內容如下,注意,其中//號或/**/號中的內容是為方便讀者理解而加的注釋: **SD卡插入的Uevent消息** ~~~ //mmc表示MultiMedia Card,這里統稱為SD卡 add@/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:c9f2/block/mmcblk0 ACTION=add //add表示設備插入,另外還有remove和change等動作 //DEVPATH表示該設備位于/sys目錄中的設備路徑 DEVPATH=/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:c9f2/block/mmcblk0 /* SUBSYSTEM表示該設備屬于哪一類設備,block為塊設備,磁盤也屬于這一類設備,另外還有 character(字符)設備等類型。 */ SUBSYSTEM=block MAJOR=179//MAJOR和MINOR分別表示該設備的主次設備號,二者聯合起來可以標識一個設備 MINOR=0 DEVNAME=mmcblk0 DEVTYPE=disk//設備Type為disk NPARTS=3 //這個表示該SD卡上的分區,我的SD卡上有三塊分區 SEQNUM=1357//序號 ~~~ 由于我的SD卡上還有分區,所以還會接收到和分區相關的Uevent。簡單看一下: **SD卡插入后和分區相關的Uevent消息** ~~~ add@/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:c9f2/block/mmcblk0/mmcblk0p1 ACTION=add //比上面那個DEVPATH多了一個mmcblk0p1 DEVPATH=/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:c9f2/block/mmcblk0/mmcblk0p1 SUBSYSTEM=block MAJOR=179 MINOR=1 DEVNAME=mmcblk0p1 DEVTYPE=partition //設備類型變為partition,表示分區 PARTN=1 SEQNUM=1358 ~~~ 通過上面實例,我們和Uevent來了一次親密接觸,具體到Vold,也就是內核通過Uevent告知外部存儲系統發生了哪些事情,那么Uevent在什么情況下會由Kernel發出呢? - 當設備發生變化時,這會引起Kernel發送Uevent消息,例如設備的插入和拔出等。如果Vold在設備發生變化之前已經建立了Netlink IPC通信,那么Vold可以接收到這些Uevent消息。這種情況是由設備發生變化而觸發的。 - 設備一般在/sys對應的目錄下有一個叫uevent的文件,往該文件中寫入指定的數據,也會觸Kernel發送和該設備相關的Uevent消息,這是由應用層觸發的。例如Vold啟動時,會往這些uevent文件中寫數據,通過這種方式促使內核發送Uevent消息,這樣Vold就能得到這些設備的當前信息了。 根據上面介紹可知,Netlink和Uevent的目的,就是讓Vold隨時獲悉外部存儲系統的信息,這至關重要。我們總不會希望發生諸如SD卡都被拔了,而Vold卻一無所知的情況吧?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看