作者:shenzi
鏈接:http://blog.csdn.net/shenzi
Windows內核學習:I/O系統
1.I/O系統組件
Windows的I/O系統如圖1所示,由幾個可執行模塊和設備驅動程序組成。
圖1:I/O系統組件
- I/O管理器將應用程序和系統組件連接到虛擬的、邏輯的以及物理的設備上,並定義支持這些設備的基礎體系結構。
- 一 個設備驅動程序通常爲某種特定類型的設備提供I/O接口。設備驅動程序接收I/O管理器發來的命令。這些命令被導向I/O管理器所管理的設備。當那些命令 完成後驅動程序通知I/O管理器。設備驅動程序經常利用I/O管理器向前傳遞I/O指令給其它設備驅動程序。在某種設備接口或控制的實現中,這些設備驅動 程序是共享的。
- PnP管理器與I/O管理器和一種叫做“總線驅動程序(bus driver)”的設備驅動程序緊密合作,指導硬件資源的分配,並檢測和響應硬件設備的到達和刪除。當檢測到設備時,PnP管理器與總線驅動程序負責加載 設備驅動程序。當一個設備被添加到系統而不具備合適的設備驅動程序時,可執行的即插即用組件調用某個用戶模式的PnP管理器的設備安裝服務。
- 電源管理器也與I/O管理器緊密合作,指導系統以及個別設備驅動器實現電源狀態的遷移。
- Windows管理裝置(WMI)支持稱爲“WDM WMI提供程序”的例程。在用戶模式利用WDM WMI提供者作爲中介與WMI通信,允許設備驅動程序作爲間接地提供者。
- 註冊表充當數據庫,存儲附屬於系統的基本設備的描述以及驅動器的初始化和配置。
- INF 文件是驅動程序安裝文件,用後綴.inf表示。INF文件是一個特定硬件設備與控制該設備的驅動程序之間的聯繫紐帶。它們由類似於腳本的指令組成,描述相 應的設備、驅動程序文件的源目標位置、安裝驅動程序所需要的註冊表修改,以及驅動程序的依賴信息。Windows用來檢驗設備文件是否通過WHQL測試的 數字簽名存儲在.cat文件中。
- 硬件抽象層(HAL)通過提供隱藏平臺之間的差別的API將驅動程序從處理器和中斷控制器的規範中隔離開來。實際上,HAL是計算機主板上所有設備的總線驅動程序,不受驅動程序的控制。
圖2:典型的I/O請求流程
在
Windows中,線程在虛擬的文件上執行I/O操作。操作系統將所有的I/O請求抽象爲對虛擬文件的操作,從而隱藏了I/O操作的目標可能不是一個文件
結構型設備的事實。這種抽象將應用程序到設備的接口一般化。虛擬文件是指某種被當作文件對待的I/O資源或目的地,例如文件、目錄、管道、郵件槽等。所有
讀寫的數據都被看作是指向相應虛擬文件的簡單的字節流。
I/O管理器:
- I/O管理器定義有序的工作框架或模型,在該框架內I/O請求被髮送給設備驅動程序。I/O系統是包驅動的。大多數I/O請求都是用I/O請求包(IRP)表示的。IRP是一種數據結構,包含描述一個I/O請求的完整信息。
- I/O管理器創建代表I/O操作的IRP,將該IRP指針傳遞給正確的驅動程序,並在I/O操作完成後釋放該包。相反,驅動程序接收IRP,執行IRP指定的操作,並在操作完成後將IRP傳回給I/O管理器,或者是將其傳遞給另一個驅動程序進一步處理。
- I/O管理器還爲不同的驅動程序提供公共代碼。驅動程序調用這些代碼執行各自的I/O處理。
- 驅動程序提供的統一的、模塊化的接口,使I/O管理器可以調用任何驅動程序而不需要與它的內部結構或細節有關的任何特殊知識。
爲了集成I/O管理器和其它I/O系統組件,設備驅動程序必須確保實現了它所管理的設備類型的指導準則以及管理設備時所起的作用。設備驅動程序例子如圖3 :
圖3:文件驅動程序和磁盤驅動程序的分層
因爲所有驅動程序—設備驅動程序和文件系統驅動程序—對操作系統都呈現同樣的工作框架,所以可以很容易地將另外的驅動程序插入層次結構中,而不需改變現有的驅動程序或者是I/O系統。
設備驅動程序由一組例程組成,這些例程被用來處理不同階段的I/O請求。圖4描述了關鍵的功能驅動程序例程:
圖4:主要的設備驅動程序例程
即插即用管理器:
即 插即用(Plug and Play,PnP)管理器是支持Windows識別並自適應地更改硬件配置能力的主要組件。用戶不需要爲安裝或刪除設備而去理解硬件或手工配置的複雜性。 即插即用功能需要硬件級、驅動程序級和操作系統級的寫作。附加在總線上的設備枚舉與識別的工業標準是Windows即插即用功能的基礎。
- PnP管理器自動識別所安裝的設備;
- 硬件資源的分配是PnP管理器的任務;
- 加載適當的驅動程序時PnP管理器的另一項職責;
- PnP管理還實現應用程序和驅動程序檢測硬件配置的更改的機制。
就像Windows的即插即用給你功能需要系統的硬件支持那樣,它的電源管理性能也需要一件支持。這些硬件必須遵從高級配置與電源接口(ACPC)規範。
ACPC標準爲系統和設備定義了各種不同的電源級別。表1描述了系統的六種電源狀態。分別以S0(完全打開或工作態)到S5(完全關閉)表示它們。
表1:系統電源狀態定義
2.I/O數據結構
有四種主要的數據與I/O請求相關:文件對象、驅動程序對象、設備對象和I/O請求包(IRP)。
文件對象:
文件對象是處理文件或設備的內核模式結構,它們是兩個或兩個以上用戶模式進程的線程可以共享的系統資源,它們可以又名稱,它們由基於對象的安全機制所保護,並且它們支持同步。
當調用程序打開一個文件或簡單設備時,I/O管理器將返回一個文件對象句柄。圖5說明了打開一個文件時所發生的情況:
圖5:打開一個文件對象
驅動程序對象和設備對象:
當線程打開一個文件對象句柄時,I/O管理器必須從文件對象的名稱決定它應該調用哪個(或哪些)驅動程序來處理請求。而且,I/O管理器必須在線程下一次使用同一個文件句柄時可以查找這個信息。一下系統對象滿足這些要求:
- “驅動程序對象"在系統中代表一個獨立的驅動程序。I/O管理器從驅動程序對象獲取驅動程序的調度例程(入口點)的地址。
- ”設備對象“在系統中代表一個屋裏或邏輯設備並描述了它的特徵,例如它所需要的緩衝區對齊方式以及用來保存到來的I/O請求包的設備隊列的位置。
圖6:驅動程序對象
I/O請求包:
I/O請求包(IRP)是I/O系統用來存儲處理I/O請求所需信息的地方。當線程調用I/O服務時,I/O管理器就構造一個IRP來表示在整個I/O系統進展中要進行的操作。
圖7:涉及單層驅動程序I/O請求的數據結構
3.I/O處理
我們來考察一下I/O請求時如何在系統中流動的。圖8說明了當讀取操作啓動後的控制流程。
圖8:I/O操作的控制流程
跟蹤對單層內核模式設備驅動程序的同步I/O請求。處理對單層驅動程序的同步I/O請求包括以下7步,如圖9:
1) I/O請求經過子系統DLL;
2) 子系統DLL調用I/O管理器的NtWriteFile服務;
3) I/O管理器分配一個描述該請求的IRP並通過調用其擁有的IoCallDriver函數將該IRP發送給驅動程序(這裏指設備
驅動程序)
4) 驅動程序將IRP中的數據傳輸到設備並啓動I/O操作;
5) 驅動程序通過中斷CPU,發信號給I/O完成例程;
6) 在設備完成了操作並且中斷CPU時,設備驅動程序服務於中斷;
7) 驅動程序調用I/O管理器的IoComleteRequest函數通知其自身已經完成IRP請求的處理,然後I/O管理器完成該I/O 請求。
圖9: 單層驅動程序的同步I/O請求
參考:
WINDOWS 2000內部揭祕
Windows OS Internals Curriculum Resource Kit (CRK)