Windows Debugging之十

來源:互聯網
上載者:User

驅動程式的結構

===========

IO系統控制並駕馭者著驅動程式的執行. 驅動程式有一系列的函數組成, 這些函數在IO請求的處理的不同階段被調用. 說明了驅動功能函數的要點:

  • 一個初始化函數(An initialization routine)- 當IO管理器把驅動程式載入到作業系統中的時候, IO管理器會執行一個驅動的初始化函數, 這個函數典型地被稱作DriverEntry.
  • 一個添加裝置函數(An add-device routine)- 一個支援隨插即用的驅動程式會實現一個裝置添加函數. 當這個驅動負責的裝置被監測到的時候, PnP管理器會通過這個函數向驅動程式發送通知.
  • 一系列的分配函數(A set of dispatch routines)- 分配函數是裝置驅動程式提供的主要功能的函數. 舉例包括, 開啟, 關閉, 讀, 寫還有任何其他裝置支援的功能, 這些裝置可以是檔案系統, 也可以是網路.
  • 一個啟動IO函數(A start I/O routine)- 驅動程式可以使用啟動IO函數來初始化發送向另一個裝置的資料轉送, 也可以初始化別的裝置向它的資料轉送. 這個函數只在依賴於IO管理器來將發向裝置的請求排入隊列的裝置中定義. IO管理器通過序列化IRPs的方式來確保驅動每次只處理一個IRP. 多數驅動同時地處理多個IRP, 但是序列化對某些驅動來說是合理的, 比如說鍵盤驅動.
  • 一個中斷服務函數(An interrupt service routine (ISR))- 當一個裝置中斷的時候, 核心的中斷分配器將控制轉交給這個函數. 在Windows IO模型中, 中斷服務函數(ISR)運行在裝置插斷要求等級(device interrupt request level)(DIRQL), 所以它們為了避免不必要的對low-level的中斷處理的阻礙, 執行的時候所做的操作是越少越好. 一個ISR將拒絕了的低IRQL的函數調用(deferred procedure call)(DPC)進行排隊處理, 以便進行剩下請求的中斷處理. (只有依靠中斷驅動式的裝置有ISR, 檔案系統讀驅動, 比如說, 就沒有ISR了)
  • 一個服務中斷的DPC函數(An interrupt-servicing DPC routine)- DPC函數執行大多數的工作, 這些工作跟在ISR執行之後的裝置中斷的處理有關. DPC函數執行在一個比ISR更低的IRQL(DPC/dispatch level)上, 也就是裝置水平(device level), 這樣才能避免不必要地阻礙其他的中斷. 一個DPC函數初始化IO的結束, 並且啟動裝置中的隊列裡的下一個IO操作.

儘管下面的函數在中並沒有顯示出來, 但他們在很多種類的裝置驅動中可以找得到:

 

  • 一個或更多的結束函數(One or more I/O completion routines)- 一個分層次的驅動可能會有IO完成函數, 用來在一個低水平的驅動結束了IRP(I/O request packet)的處理時, 通知裝置. 比如說IO管理器會在一個驅動程式結束了將資料轉換到檔案中的時候, 調用檔案系統驅動的IO完成函數. 結束函數通知檔案系統驅動: 那個轉換資料的操作是成功了, 失敗了, 還是取消了, 它還允許檔案系統驅動進行清理工作.
  • 一個取消IO函數(A cancel I/O routine)- 如果一個IO操作被取消了, 驅動程式可以定義一個或更多取消IO函數. 當這個驅動程式收到一個可以被取消的IO請求的IRP時, 它會指配一個取消函數到IRP中. 如果一個處理IO的線程在IO請求結束之前就退出了, 或者取消了操作(比如說通過Windows的CancelIo函數), 那麼IO管理器會執行IRP中的取消函數, 如果這個IRP被指派了這樣一個函數的話. 一個對於不論做什麼步驟的IO操作的取消函數, 對釋放任何已經獲得了的資源的IRP來說是非常必要的, 如同結束了的處於取消狀態的IRP一樣.
  • 一個卸載函數(An unload routine)- 寫在函數釋放驅動正在使用的任何系統資源, 如此IO管理器才可以他們從記憶體中移除出去. 任何在初始化函數中請求來的資源一般都會在卸載函數中釋放掉. 所以, 在系統啟動並執行情況下, 一個驅動可以被成功地載入和卸載.
  • 一個系統關機通知函數(A system shutdown notification routine)- 這個函數允許驅動在系統關閉之前進行清理工作.
  • 錯誤記錄檔函數(Error-logging routines)- 當未預計的錯誤發生的時候(比如說, 磁碟上的某一塊兒損壞了), 那麼驅動程式的錯誤處理函數會記錄下這個錯誤的發生, 並通知IO管理器. IO管理器將這個資訊寫入到錯誤記錄檔中.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.