第8章 I/O系統(第一節)

nuvage發表於2014-04-21
   Windows I/O系統由幾個執行體元件構成,它們合起來管理硬體裝置,並嚮應用程式和系統提供介面以便操作這些硬體裝置。在本章中,我們首先列出I/O系統的設計目標,這些設計目標已經影響了I/O系統的實現。接著,我們將討論I/O系統的各個元件,包括I/O管理器、即插即用(PnP)管理器和電源管理器。然後我們將檢查I/O系統和各種型別裝置驅動程式的結構和元件。我們將看一看那些用來描述裝置、裝置驅動程式和I/O請求的關鍵資料結構,之後,我們將介紹在完成I/O請求過程中的必要步驟,這是因為它們將貫穿整個系統。最後,我們將介紹裝置檢測、驅動程式安裝和電源管理的工作原理。   

8.1 I/O系統元件

    Windows I/O系統的設計目標是,為應用程式提供一個有關裝置的抽象,包括硬體裝置(物理)和軟體裝置(虛擬或邏輯)。此裝置抽象具有以下特性:
   ■  統一的、跨裝置的安全性和命名機制,以保護那些可共享的資源(關於Windows安全模型的描述,請參見卷1的第6章);
   ■  高效能的、非同步的、基於資料包的I/O,以支援那些可擴充套件應用程式的實現;
   ■  提供了一些服務,支援用高階語言來編寫驅動程式,以及易於在不同體系結構之間移植驅動程式;
   ■  層次結構和擴充套件性,以允許加入新的驅動程式,從而在不改變其他驅動程式的情況下,透明地改變這些驅動程式或對應裝置的行為;
   ■  動態載入和解除安裝裝置驅動程式,因而可以做到按需載入驅動程式,並且當不需要驅動程式的時候,它們不會消耗系統資源;
   ■  支援即插即用,也就是說系統為新檢測到的硬體找到並安裝驅動程式,為它們分配所需要的硬體資源,也允許應用程式發現並啟用裝置介面;
   ■  支援電源管理,因此,系統或單獨的裝置可以進入低電源狀態;
   ■  支援多個可安裝檔案系統,包括FAT、CD-ROM檔案系統(CDFS)、通用磁碟格式(UDF,Universal Disk Format)檔案系統和Windows檔案系統(NTFS)(有關檔案系統型別和結構的更多資訊,見第12章“檔案系統”);
   ■  Windows管理規範(WMI)支援與可診斷性,因此,可以通過WMI應用程式和指令碼來管理和監視驅動程式(卷1的第4章“管理機制”介紹了WMI);
   為了實現這些特性,Windows I/O系統包含以下幾個執行體元件及裝置驅動程式,如圖8-1所示。
   ■  I/O管理器是I/O系統的核心。它將“應用程式和系統元件”與“虛擬的、邏輯的和物理的裝置”連線起來,而且它定義;額支援裝置驅動程式的基礎架構;
   ■  裝置驅動程式通常為某種特定型別的裝置提供一個I/O介面。驅動程式是一個解釋高階命令(例如讀或寫),釋出低階、特定於裝置命令(例如寫控制暫存器)的軟體模組。裝置驅動程式接收來自I/O管理器傳送給它們的命令,當這些命令完成時,它們通知I/O管理器。裝置驅動程式通常使用I/O管理器來向其他共享同一裝置介面或控制的裝置驅動程式轉送I/O命令;
   ■  PnP管理器與I/O管理器、一種稱為匯流排型驅動程式(bus driver)的裝置驅動程式緊密協作,共同指導硬體資源的分配,檢測並響應硬體裝置的加入和移除。當檢測到裝置時,PnP管理器和匯流排型驅動程式負責載入該裝置的驅動程式。當一個裝置被加入到缺乏正確的裝置驅動程式的系統時,執行體即插即用元件就會請求使用者模式PnP管理器的裝置安裝服務;
   ■  電源管理器與I/O管理器、PnP管理器密切協作,通過電源狀態轉換來引導系統及獨立裝置驅動程式;
   ■  Windows管理規範(WMI)支援例程,它們被稱為Windows驅動程式模型(WDM)WMI提供者。裝置驅動程式可以使用WDM WMI提供者作為中間媒介與使用者模式的WMI服務進行通訊,因而它們間接地成了WMI提供者(有關WMI的更多資訊,請參見卷1第4章的“Windows管理規範”一節);
   ■  登錄檔被當作一個資料庫,儲存了當前系統上附載的基本硬體裝置的描述資訊,以及驅動程式初始化和配置的設定資訊(更多資訊請參見卷1第4章的“登錄檔”一節);
   ■  INF檔案是驅動程式安裝檔案,通過.inf副檔名來指定。INF檔案是一個特定硬體裝置與作為該裝置主控制的驅動程式之間的紐帶。INF檔案由像指令碼型別的指令構成,這些指令描述了該INF檔案所對應的裝置、驅動程式檔案的源位置和目標位置、安裝驅動程式所需要的登錄檔修改以及驅動程式的相依性資訊。Windows利用數字簽名來檢驗一個驅動程式檔案已經通過了Microsoft Windows硬體質量實驗室(WHQL,Windows Hardware Quality Lab)的測試,這些數字簽名被儲存在.cat檔案中。數字簽名還被用於防止驅動程式及其INF檔案的篡改;
   ■  硬體抽象層(HAL)通過提供一組API,將平臺之間的差異隱藏起來,從而使驅動程式與處理器和中斷控制器的特殊性相互隔離開。從本質上來說,HAL是“計算機主機板上所有不受其他驅動程式控制的裝置”的匯流排型驅動程式。

enter image description here

圖8-1 I/O系統元件

I/O管理器

   I/O管理器是I/O系統的核心,因為它定義了一個非常整齊的框架(或者稱為模型),在這個框架內部,I/O請求被遞交給裝置驅動程式進行處理。I/O系統是包驅動的(packet driven)。絕大多數I/O請求都是通過一個I/O請求包(IRP,I/O request packet)來表示的,這些I/O請求包被從一個I/O系統元件傳遞到另一個I/O系統元件(正如你在“快速I/O”一節中看到的那樣,快速I/O是一個例外:它沒有使用IRP)。這種設計使得單個應用程式執行緒可以併發地管理多個I/O請求。IRP是一個資料結構,包含了用來描述一個I/O請求的完整資訊(在本章稍後的“I/O請求包”一節中你將會看到更多有關IRP的資訊)。  

   I/O管理器在記憶體中建立一個IRP來代表一個I/O操作,傳遞一個指向IRP的指標到正確的驅動程式,當此I/O操作完成時再處理該請求包。相反地,驅動程式接收一個IRP,執行該IRP指定的操作,然後將IRP傳回給I/O管理器,這是因為:所請求的I/O操作已經完成,或者必須將其傳給另一個驅動程式以作進一步處理。  

   除了建立和處理IRP外,I/O管理器也提供一些對於不同驅動程式都通用的程式碼,驅動程式可以呼叫這些程式碼來完成其I/O處理。由於這些通用任務都被合併到I/O管理器中了,因此,單獨的驅動程式變得更簡單,也更為緊湊。例如,I/O管理器提供了這樣一個功能:允許一個驅動程式呼叫其它驅動程式。它也為I/O請求管理緩衝區、為驅動程式提供超時支援、記錄下哪些可安裝的檔案系統被載入到作業系統中。在I/O管理器中有將近100個不同的例程可供裝置驅動程式呼叫。  

   I/O管理器也提供了靈活的I/O服務,通過這些I/O服務,使得環境子系統(比如Windows和POSIX)實現各自的I/O功能。這些服務包括專門針對非同步I/O的複雜服務,開發人員利用這些非同步I/O服務可以建立起可擴充套件的高效能伺服器應用程式。  

   驅動程式所具有的一致的、模組化的介面使得I/O管理器能夠呼叫任何一個驅動程式,而無需任何有關驅動程式資料結構或內部細節的專門知識。作業系統對待所有的I/O請求就好像它們都是針對一個檔案進行操作一樣;驅動程式將這些請求從一個針對虛擬檔案的請求,轉變成一個與硬體相關的請求。驅動程式也可以相互呼叫(使用I/O管理器),從而實現了I/O請求分層、獨立的處理過程。  

   除了提供常規的開啟、關閉、讀和寫功能以外,Windows I/O系統還提供了一些高階特性,比如非同步的、直接的、緩衝的以及分散/聚集的I/O。在本章後續的“I/O型別”一節講述了這些高階特性。  

典型的I/O處理過程

   絕大多數I/O操作並不涉及I/O系統的所有元件。典型的I/O請求首先從“一個應用程式執行一個與I/O相關的函式(比如從一個裝置中讀取資料)”開始,此請求將由I/O管理器、一個或多個裝置驅動程式及HAL來處理。  

   正如剛剛提到的,在Windows中,執行緒在虛擬檔案上執行I/O操作。所謂虛擬檔案,是指任何可被當作檔案來對待的I/O源或目標(比如檔案、目錄、管道和郵件槽)。作業系統將所有的I/O請求都抽象成針對一個虛擬檔案的操作,這是因為I/O管理器除了檔案之外,沒有其它任何事物的相關知識,因此需要驅動程式將面向檔案的操作(開啟、關閉、讀、寫)轉換成裝置相關的命令。這一抽象也使得應用程式對裝置的介面變得更為泛化。使用者模式的應用程式(不管是Windows還是POSIX)都呼叫文件化的函式,這些函式又依次呼叫內部的I/O系統函式來讀一個檔案、寫一個檔案,或者執行其它操作。I/O管理器動態地將這些虛擬檔案請求引導到正確的裝置驅動程式上。圖8-2顯示了一個典型I/O請求流程的基本結構。

enter image description here

圖8-2 一個典型I/O請求流程

   在下面的章節中,我們將更加細緻地看一看這些元件,討論各種裝置驅動程式的型別、它們的結構如何組織、它們如何載入和初始化,以及它們如何處理I/O請求。然後,我們將介紹PnP管理器和電源管理器的操作及其角色。

相關文章