裝置管理器和流式介面裝置驅動程式
一
串列埠驅動程式是典型的流式介面裝置驅動程式
串列埠是典型的流式裝置。在使用串列埠時,二進位制資料像流水一樣,從一台裝置經過串列埠流到另外一台裝置,這樣的裝置在
windows ce
中稱為流式裝置。
在windows ce
中使用流式介面驅動程式管理流式裝置。流式介面裝置驅動程式,就是向裝置管理器暴露流式介面函式的驅動程式。在流式介面驅動程式中,驅動程式把外設抽象成乙個檔案,而應用程式則使用普通的檔案
api函式來對流式裝置進行訪問。
二
裝置管理器以匯流排列舉方式載入流式介面的裝置驅動程式
在
windwos ce6.0
版本起,裝置管理器不再是單獨的使用者態程序
device.exe
,而只是作業系統核心程序中的乙個動態鏈結庫
device.dll
。裝置管理器具有以下幾項職能:(1
)裝置管理器負責將動態鏈結庫形式的裝置驅動程式載入到自己所在的程序的位址空間中。
device.dll
本身執行在核心程序
nk.exe
中,所以載入的裝置驅動程式也執行核心程序中。這是
windows ce 6.0
和windows ce 5.0
以前版本的重大區別。(2
)在系統啟動和即插即用裝置連線上來時負責載入和初始化驅動程式,在外設不再使用時解除安裝驅動程式。(3
)管理外設的狀態,當有特定的事件發生時根據使用者的設定對應用程式發出通知。(4
)統一管理可分配給外設使用的記憶體和
i/o埠位址空間資源。(5
)提供對外設的電源管理的介面。
裝置管理器載入裝置驅動程式是按照這樣的方式進行的:首先裝置管理器執行自身的初始化,然後初始化資源管理器和電源管理器,最後裝置管理器根據登錄檔的設定,載入匯流排列舉器
busenum.dll
,有匯流排列舉器負責載入和初始化裝置驅動程式。在
windows ce
登錄檔的
[hkey_local_machine/drivers/builtin]
可以設想,在基於
windows ce
的嵌入式硬體上,存在乙個大的虛擬匯流排,嵌入式系統中的所有外設都連線在這個虛擬匯流排上。這裡的匯流排列舉器
busenum.dll
就是這個虛擬匯流排的裝置驅動程式。
三匯流排列舉器載入乙個裝置驅動程式的具體步驟
匯流排列舉器載入乙個裝置驅動程式按照以下幾個步驟進行:
(1)匯流排列舉器被裝置管理器載入並且完成自身的初始化後,開始列舉自己對應的登錄檔鍵的各個子鍵,從中尋找合法的裝置驅動程式。
(2)匯流排列舉器從
[hkey_local_machine/drivers/builtin]
登錄檔鍵的各個子鍵中尋找名為
dll的鍵值,合法的鍵值是裝置驅動程式的動態鏈結庫檔名字串,也是匯流排列舉器要載入的可執行檔案。
(3)匯流排列舉器呼叫
activatedevcieex
函式,執行載入第二步中獲取的裝置驅動的動態鏈結庫到自己所在的程序位址空間,也就是
nk.exe
系統核心程序。
(4)匯流排列舉器要在註冊鍵
[hkey_local_machine/drivers/active]
下為剛載入的驅動程式生成乙個子鍵。後文稱這個登錄檔子鍵為裝置驅動程式的
active
登錄檔鍵。由匯流排列舉器載入的裝置驅動程式的
active
登錄檔鍵中的各表項主要是被夾在過程中即期產生的動態資料。
(5)匯流排列舉器呼叫裝置驅動程式的初始化函式
init
,這個函式必定有乙個引數是上一步產生的裝置驅動的
active
登錄檔鍵的字串指標。
(6)由裝置驅動程式的
init
函式執行最基本的硬體初始化工作,包括:為裝置設定乙個初始工作狀態,將裝置的記憶體緩衝區和
i/o埠對映到系統的虛擬位址等。
裝置管理器總結
enable和disable的問題都解決了,剩下的問題都是關於怎麼生成裝置樹並呈現出來的問題,windows作業系統應該有現成的庫函式或者api呼叫,能把整個一棵樹一次性調出。但是c 開發環境下很少使用指標鍊錶的概念,就算系統中有這麼一棵樹,那麼也應該是用鍊錶串起來的,在c 這邊我們要怎麼接收呢?官...
Powershell 檢測裝置管理器
下圖為其中乙個裝置的詳細資訊 name存在且 pnpclass 為 null 的裝置為其他裝置 other devices status 為 error 的裝置為未正常工作裝置 yellow bang pnpclass 表示裝置所屬類 通過比較資料的改變來檢測裝置的變化 function catch...
Linux udev 使用者空間裝置管理器
參考文獻 維基百科 udev官方文件 ibm developerworks 中國 本章正文 udev 是linux kernel 2.6系列的裝置管理器。它主要的功能是管理 dev目錄底下的裝置節點。它同時也是用來接替devfs及hotplug的功能,這意味著它要在新增 刪除硬體時處理 dev目錄以...