驅(qū)動程序在任何操作系統(tǒng)下都和系統(tǒng)內(nèi)核有著密切的關(guān)系,尤其在WIN2000下。在進入WIN2000驅(qū)動程序世界之前,本章先介紹驅(qū)動程序設(shè)計原理和WIN2000構(gòu)架。
系統(tǒng)的整體結(jié)構(gòu)
WIN2000操作系統(tǒng)是計算機歷史上最安全的操作系統(tǒng),本節(jié)介紹WIN2000系統(tǒng)中驅(qū)動程序設(shè)計者最關(guān)心和最感興趣的部分。
WIN2000的設(shè)計目標(biāo)
有趣的是,原始的NT("New Technology")概念中不包含操作系統(tǒng)環(huán)境,直到1989年第一個NT操作系統(tǒng)出現(xiàn)了很長時間后。但是它還保持著原始的設(shè)計目標(biāo):
兼容性: 盡可能的支持現(xiàn)有的軟件和硬件 。
穩(wěn)定性和可靠性: 操作系統(tǒng)不會因為用戶的誤操作而損壞,一個用戶程序應(yīng)該不會使操作系統(tǒng)崩潰。
可移植性: 操作系統(tǒng)應(yīng)當(dāng)可在盡可能多的當(dāng)前和未來的平臺上運行。
可擴展性: 隨著時間的流逝,市場的改變,操作系統(tǒng)應(yīng)當(dāng)可以只用添加少的代碼就可以支持新的硬件和添加新的功能。
性能: 操作系統(tǒng)應(yīng)當(dāng)盡可能大的發(fā)揮硬件的效能。
當(dāng)然,隨著時間的流逝,操作系統(tǒng)的設(shè)計目標(biāo)也是改變的,剩下的部分介紹怎樣在設(shè)計中實現(xiàn)這些目標(biāo)。
WIN2000的硬件特權(quán)級別
為實現(xiàn)穩(wěn)定性和可靠性的設(shè)計目標(biāo),WIN2000的設(shè)計者使用用戶模式服務(wù)結(jié)構(gòu),用戶的程序在操作系統(tǒng)的用戶模式服務(wù)程序中運行。
用戶模式中,代碼被嚴(yán)格約束在對系統(tǒng)沒有損害的范圍內(nèi)。例如: 通過虛擬內(nèi)存映像,一個程序不能訪問其它程序的內(nèi)存區(qū)(兩個程序共同定義的公用內(nèi)存區(qū)除
外)。硬件I/O指令不能被執(zhí)行。所有的CPU指令(如CPU中斷)不能被執(zhí)行(在特定的特權(quán)級下)。所有的這些被阻止的操作如果想運行,它們必須通過陷
阱門來請求操作系統(tǒng)內(nèi)核。
操作系統(tǒng)內(nèi)核程序運行在內(nèi)核模式下,它可以執(zhí)行所有有效的CPU指令,包括I/O操作,可訪問任何程序的內(nèi)存區(qū),當(dāng)然是那些沒有被翻出內(nèi)存而被存到磁盤的內(nèi)存區(qū)。
所有的現(xiàn)代的處理器都可以工作在特權(quán)級別模式和非特權(quán)級別模式下,用戶模式工作在非特權(quán)級別模式下,內(nèi)核模式工作在特權(quán)級別模式下。而不同的平臺和
CPU執(zhí)行特權(quán)級別模式是不同的,為了達到可以在這兩個模式下運行的目標(biāo),操作系統(tǒng)抽象了這兩個模式,操作系統(tǒng)總是使用這些抽象的代碼來在這兩個操作模式
下切換。例如: 在Intel平臺上,內(nèi)核模式使用Ring 0指令系統(tǒng),而用戶模式使用了Ring 3指令系統(tǒng)。
我們編寫的驅(qū)動程序是運行在內(nèi)核模式下,我們的不正確的代碼將危及到WIN2000操作系統(tǒng)的安全,所以,我們必須格外小心我們代碼的邊界條件,以確保它們不會損壞整個操作系統(tǒng)。
可移植性
為了達到可移植性的目標(biāo),NT設(shè)計者選擇了軟件的分層結(jié)構(gòu)。如圖1.1所示:

圖 1.1:WIN2000系統(tǒng)的分層結(jié)構(gòu)
硬件抽象層(HAL)隔開了硬件平臺和操作系統(tǒng)以及驅(qū)動程序,驅(qū)動程序依賴硬件抽象層的代碼和宏去識別硬件的寄存器和總線,有時,驅(qū)動程序依賴I/O管理器去分享硬件資源,在以后的章節(jié)中將介紹利用硬件抽象層和其它的操作系統(tǒng)服務(wù)程序去開發(fā)設(shè)備無關(guān)的驅(qū)動程序。
可擴展性
WIN2000的內(nèi)核也負責(zé)系統(tǒng)中所有線程的調(diào)度與分配,線程是程序中最小的可獨立運行的部分,為保持每個線程的獨立性,每個線程的設(shè)備上下文必須被保
存下來,線程的上下文由CPU寄存器狀態(tài)(包括一個獨立的堆棧和程序計數(shù)器),ID(線程ID,也叫線程標(biāo)識符),特權(quán)級別代碼,線程地址和其它線程相關(guān)
信息組成。
調(diào)度程序決定哪一個線程何時運行,在單處理機的環(huán)境中,一個時間只能有一個線程得到處理機的執(zhí)行。
在多處理機的環(huán)境中,同一時刻不同的線程可能工作在不同的處理機上,是真正的并發(fā)執(zhí)行。調(diào)度程序分配時間片給各個線程,高優(yōu)先權(quán)的線程搶先占有時間片。
操作系統(tǒng)的主要任務(wù)是調(diào)度線程,還有一些必要的工作,如: 內(nèi)存管理,進程管理,安全管理和I/O管理。這些部分叫做執(zhí)行部件,它被作為軟件模塊(除了
I/O管理器這個重要部分),隨著時間的推移,微軟會作一些必要的增加,刪除,分離來作為改進或折衷。WIN2000就是后來才加了活動目錄服務(wù)。
保持小的,干凈的內(nèi)核,外加執(zhí)行模塊是WIN2000的原則,這個原則使WIN2000經(jīng)過近十年的修改,維護依然是一個流行的操作系統(tǒng)。
性能
分層的軟件設(shè)計表現(xiàn)出良好的性能,NT的開發(fā)團隊當(dāng)然也注意到了:
到目前為止,所有的層別運行在同一硬件模式,即內(nèi)核模式,因此,中間層的調(diào)用比處理器的調(diào)用不會多花多少時間,確實,HAL常常使用宏來完成內(nèi)嵌程序的執(zhí)行。
有助于集中精力去處理并發(fā),分配盡可能多的線程給任務(wù)的不同部分,因為所有的執(zhí)行部分都是多線程的,幫助程序盡可能少的阻塞,處理器忙等待和中斷停機時間。
當(dāng)用戶和系統(tǒng)線程通過驅(qū)動程序來請求服務(wù)的時候,驅(qū)動程序代碼阻塞執(zhí)行是致命的錯誤,如果這些請求不能快速處理,將會導(dǎo)致設(shè)備忙或者很慢,這些請求將排隊等候后續(xù)處理,幸運的是,I/O管理器使這個過程變的很容易。
執(zhí)行部件
執(zhí)行部件提供WIN2000操作系統(tǒng)最基本的服務(wù)(除了線程調(diào)度),它們的作用非常明顯,解釋如下:

圖1.2 執(zhí)行部件的組成
系統(tǒng)服務(wù)接口
它提供從用戶模式到內(nèi)核模式的入口。它允許內(nèi)核模式代碼安全的調(diào)用操作系統(tǒng)服務(wù),依靠這個接口,從用戶模式到內(nèi)核模式可能只是簡單的一個CPU指令或者是一個存儲于恢復(fù)上下文開關(guān)。
對象管理器
WIN2000操作系統(tǒng)幾乎將所有的服務(wù)看成對象提供給用戶,例如: 用戶模式程序為了使線程同步而向操作系統(tǒng)請求互斥對象,操作系統(tǒng)提供的互斥對象是一個操作系統(tǒng)對象,用戶模式程序只能通過句柄來操作它。文件,進程,線程,事件,內(nèi)存塊,注冊表的鑒值都是以操作系統(tǒng)對象的形式出現(xiàn),所有的這些都是被對象管理器創(chuàng)建和銷毀。
配置管理器
配置管理器紀(jì)錄了計算器上所有硬件和軟件的安裝配置情況,這些信息被紀(jì)錄在一個叫做注冊表的數(shù)據(jù)庫中,設(shè)備驅(qū)動程序通過注冊表可得到它的工作環(huán)境信息。
進程管理器
在WIN2000中,進程是線程的工作環(huán)境,每個進程包含一個私有地址空間和一個安全標(biāo)識。線程是最小的可執(zhí)行實體,一個進程可以包含一個或者多個線程。
進程管理器依靠執(zhí)行部件的其它部分才能工作,如: 對象管理器和虛擬內(nèi)存管理器。
虛擬內(nèi)存管理器
在WIN2000中,程序的地址空間是平坦的,有4GB大小。只有低2GB可以被用戶模式的程序訪問,也就是說,用戶模式的程序占用低2GB空間,如果程序需要動態(tài)連接庫(DLL),動態(tài)連接庫也必須在2GB空間內(nèi)。
高2GB空間被內(nèi)核模式程序占用,當(dāng)然,驅(qū)動程序也被映像到了這里。
虛擬內(nèi)存管理器(VMM)管理整個系統(tǒng)的內(nèi)存,對于一般的用戶模式程序,如果訪問的虛擬內(nèi)存地址不在物理內(nèi)存上,虛擬內(nèi)存管理器將磁盤上相應(yīng)的文件映像到內(nèi)存中,這樣,內(nèi)存在磁盤和有限的RAM之間移動,好象程序可以訪問比RAM大的多空間。
本地進程調(diào)用
本地進程調(diào)用是同一個計算器上不同進程間通訊的機制。驅(qū)動程序不需要這個工具。
I/O管理器
I/O管理器將用戶模式的I/O操作轉(zhuǎn)變成一系列統(tǒng)一的例程(例行的過程),I/O管理器的一個目標(biāo)就是使所有的從用戶模式到內(nèi)核模式的訪問設(shè)備無關(guān),無論程序訪問鍵盤,通訊口,磁盤文件都是一樣的。
I/O管理器將用戶模式的I/O操作轉(zhuǎn)變成I/O請求包(IRP)的形式傳給驅(qū)動程序,I/O請求包是I/O管理器將命令的綜合。作為用戶模式程序于驅(qū)動程序的中間層,I/O管理器于驅(qū)動程序結(jié)合部分的代碼將是最重要的部分。
活動目錄服務(wù)
活動目錄服務(wù)是WIN2000的新的部分,它給系統(tǒng)資源提供無限的名字空間。以前,標(biāo)識系統(tǒng)資源的名字被定義在操作系統(tǒng)的有限空間內(nèi)(硬盤名,打印機
名,用戶名,文件名等),活動目錄是一個統(tǒng)一,安全,標(biāo)準(zhǔn)的方法去標(biāo)識系統(tǒng)資源,它是基于一個分等級的圖,將資源根據(jù)實體分成元,樹和森林。
基本操作系統(tǒng)的延伸
WIN2000定義了這幺多的服務(wù),它們沒有被直接的暴露給用戶模式的程序。取而代之的是,WIN2000定義了很多應(yīng)用程序接口(API),用它們來使用操作系統(tǒng)的服務(wù)。應(yīng)用程序接口在不同的子系統(tǒng)中的形式是不同的,WIN2000包含了以下的子系統(tǒng):
WIN32子系統(tǒng): 它是WIN2000固有的應(yīng)用程序接口模式,所有的其它的子系統(tǒng)都依賴于它去執(zhí)行它們的工作,因為它是很重要的,所以我們將要在后面詳細的討論。
DOS虛擬器(VDM): 提供一個16位的MS-DOS環(huán)境給一些老的16位程序。盡管它承諾了兼容性,但是很多現(xiàn)有的16位程序還是不能完全的運行。這都是因為WIN2000的堅固性和安全性,操作系統(tǒng)將干涉企圖直接訪問設(shè)備和其它系統(tǒng)資源的操作。
窗口子系統(tǒng)(WOW): 提供一個16位的WIN3X環(huán)境給一些老的16位Windows程序。有趣的是,在僅有的一個窗口子系統(tǒng)進程中,每一個16位Windows程序都是一個單獨線程,它們還互相阻止分享資源,這也正是WIN3X的環(huán)境。
POSIX子系統(tǒng): 提供POSIX1003.1標(biāo)準(zhǔn)的UNIX程序環(huán)境,很不幸,這個子系統(tǒng)不能支持其它的標(biāo)準(zhǔn)UNIX程序,這樣的話,很多UNIX程序必須在WIN2000下重寫。
OS/2子系統(tǒng): 提供一個16位的OS/2程序執(zhí)行環(huán)境,至少不再需要OS/2的陳述管理器(PM),這個子系統(tǒng)只能工作在80X86平臺上。
每個用戶程序都必須和相應(yīng)的子系統(tǒng)結(jié)合起來。例如: 程序的應(yīng)用程序接口函數(shù)不能調(diào)用其它的子系統(tǒng),或者使系統(tǒng)性能下降,這些子系統(tǒng)的設(shè)計目的是兼容性,而不是速度。
環(huán)境子系統(tǒng)(以上的五個都是WIN2000下的環(huán)境子系統(tǒng))是隔離用戶模式程序的一般手段,它們的運作是必須的。每一個用戶請求都經(jīng)過本地進程調(diào)用傳遞給這些子系統(tǒng)去加工處理,這些子系統(tǒng)或者直接執(zhí)行這些請求,或者傳遞請求給執(zhí)行部件。
WIN32子系統(tǒng)
這個子系統(tǒng)提供的應(yīng)用程序接口有以下幾個方面:
圖形用戶接口: 提供給用戶可視的窗口,對話框,控件,字體等接口。
控制臺I/O: 包括鍵盤,鼠標(biāo),顯示器,以及其它子系統(tǒng)。
執(zhí)行WIN32應(yīng)用程序接口: 提供應(yīng)用程序或者其它子系統(tǒng)與執(zhí)行部件的接口。
因為WIN32子系統(tǒng)在操作系統(tǒng)中的特殊地位和它所提供的高性能,所以它的實現(xiàn)方式與其它的子系統(tǒng)完全不同。它被分成了好幾個部分,其中一些工作在用戶模式,一些工作在內(nèi)核模式。通常,WIN32應(yīng)用程序接口被分成3部分:
USER函數(shù): 管理窗口,菜單,控件,對話框等。
GUI函數(shù): 在物理設(shè)備(如: 顯示器,打印機)上繪圖。
KENEL函數(shù): 管理非GUI資源,例如: 進程,線程,文件,同步服務(wù),KENEL函數(shù)接近于執(zhí)行部件的服務(wù)。
WIN NT4.0以后,USER函數(shù)和GUI函數(shù)被移到內(nèi)核模式,因此,用戶模式的請求用系統(tǒng)服務(wù)接口直接送到內(nèi)核模式。USER函數(shù)和GUI函數(shù)被安置在WIN32K.SYS中,如圖1.3所示:
相反的,KENEL函數(shù)依賴于一個標(biāo)準(zhǔn)的服務(wù)程序CSRSS.exe去反應(yīng)用戶程序請求。
其它子系統(tǒng)
除了環(huán)境子系統(tǒng)之外,還有一些重要的子系統(tǒng),它們是用戶模式的過程:
安全管理子系統(tǒng): 使用一個變化的過程方法和動態(tài)庫來管理本地的和遠程的安全問題,部分活動目錄工作也在這個邏輯子系統(tǒng)中。
服務(wù)控制管理器: 管理服務(wù)和驅(qū)動程序。
RPC服務(wù): 它支持網(wǎng)絡(luò)的分布式應(yīng)用程序,通過遠程的程序調(diào)用,一個計算器可將自己的一部分任務(wù)分配給其它網(wǎng)絡(luò)終端。

圖1.3 USER在GUI內(nèi)核中
內(nèi)核模式I/O構(gòu)成
本章的目的是討論內(nèi)核模式I/O子系統(tǒng)的設(shè)計目的,既然很多種類的驅(qū)動器都要討論,那幺,I/O管理器的分層驅(qū)動器也將討論。
內(nèi)核模式I/O管理器的設(shè)計目標(biāo)
內(nèi)核模式I/O管理器的總的設(shè)計目標(biāo)包括:
1.可移植性: 平臺之間。
2.可配置: 包括軟件和硬件,如WIN2000,包括完全的支持即插即用總線和設(shè)備。
3.可搶先和中斷: I/O代碼應(yīng)該不會被阻塞。
4.支持多處理器: 同樣的I/O代碼應(yīng)可在單處理器下運行,也可在多處理器下運行。
5.基于對象: I/O代碼提供的服務(wù)應(yīng)該被封裝成定義好的結(jié)構(gòu)中。包括數(shù)據(jù)于操作。
6. 支持I/O請求包: I/O管理器的請求使用一種獨特的格式。
7.支持異步I/O: I/O管理器的請求支持重新請求的模式,完成后,應(yīng)有一個機制去退出和通知調(diào)用者已完成。
除了這些眾所皆知的目標(biāo)外,它們將重點放在代碼的重用性上,將驅(qū)動程序代碼合理的分層。例如: 總線驅(qū)動器從特定的驅(qū)動器代碼被分成一些獨立的層,使很多總線共享一部分層別。在很多情況下,不同的代理商提供不同的層別,只有小心的模塊化設(shè)計才能完成代碼重用的目標(biāo)。
WIN2000驅(qū)動器的種類
曾經(jīng)有一段時間,驅(qū)動程序的作者只要理解復(fù)雜的新硬件,學(xué)會操作系統(tǒng)接
口,就可以開始工作了,無論好壞,數(shù)天后一個驅(qū)動器就會完成。今天,驅(qū)動程序的作者必須了解復(fù)雜的硬件和I/O的分層子系統(tǒng),才只不過到了工作描述的階
段,下決心開發(fā)一個什幺樣的驅(qū)動程序都是一個有趣的挑戰(zhàn),下決心去重寫或者重用一個層別將是令一個挑戰(zhàn),這一部分描述在硬件世界,操作系統(tǒng)中不同的驅(qū)動程
序。
在最高層,WIN2000支持用戶模式,內(nèi)核模式兩種驅(qū)動程序,從名字上來看,用戶模式驅(qū)動程序是運行在用戶模式的系統(tǒng)級代
碼,例如: 一個為虛擬的硬件或者新的環(huán)境子系統(tǒng)所寫的虛擬驅(qū)動器。既然WINN2000不支持直接訪問硬件,虛擬驅(qū)動器依賴運行在內(nèi)核模式的真正的驅(qū)動
器。本書不將討論用戶模式驅(qū)動程序。
內(nèi)核模式驅(qū)動程序使用系統(tǒng)級代碼編寫,且運行在內(nèi)核模式下,因為內(nèi)核模式允許直接訪問硬件,這些驅(qū)動程序被用來直接控制硬件。
向下移動一層,內(nèi)核模式驅(qū)動程序可被進一步的分成兩種,遺留模式的驅(qū)動程序和Windows驅(qū)動模式的驅(qū)動程序(WDM)。遺留模式的驅(qū)動程序需要去偵測硬件和與I/O子系統(tǒng)連接,這些是已經(jīng)由其它文獻說明過了。感激的,這些遺留模式的驅(qū)動程序可被移植到WIN2000(和WIN98)上。
Windows驅(qū)動模式的驅(qū)動程序支持即插即用,電源管理,熱拔插,自動配置。一個好的Windows驅(qū)動模式的驅(qū)動程序可以在WIN2000和Win98上使用,雖然微軟不保證二進制兼容。最多我們再用WIN98 DDK編譯一遍。
再向下移動一層,遺留模式的驅(qū)動程序和Windows驅(qū)動模式的驅(qū)動程序可被進一步的分成三種: 高層,中間層,低層。顧名思義,高層驅(qū)動程序依靠中間層和低層驅(qū)動程序去完成工作,中間層驅(qū)動程序則依靠低層驅(qū)動程序去完成工作。
高層驅(qū)動程序包括文件系統(tǒng)驅(qū)動程序(FSDs),依次的翻譯程序請求成為特定的驅(qū)動器請求,當(dāng)?shù)蛯拥尿?qū)動程序的服務(wù)已經(jīng)準(zhǔn)備好的時候它也是需要的。
微軟提供一個安裝文件系統(tǒng)工具包(IFS),不在MSDN和其它產(chǎn)品中,是單獨出售的。這個安裝文件系統(tǒng)工具包需要和驅(qū)動程序開發(fā)包和其它產(chǎn)品一起才能完成開發(fā)。使用這種工具包有很多限制。相關(guān)信悉請登祿微軟的網(wǎng)站,本書不介紹文件系統(tǒng)的開發(fā)。
中間層驅(qū)動程序包括磁盤鏡像驅(qū)動器,類驅(qū)動器(Class),迷你驅(qū)動器(MINI),過濾驅(qū)動器(FILTER)等。這些驅(qū)動器位于低層驅(qū)動器和高層
驅(qū)動器之間。例如: 磁盤鏡像驅(qū)動器接收到文件系統(tǒng)傳來的寫文件的請求,將它轉(zhuǎn)換成為兩個不同的請求傳給兩個不同的低層驅(qū)動器。
類驅(qū)動器是對代碼重用的一次嘗試,因為一種特定設(shè)備有多個驅(qū)動程序,它們之間大部分是相同的,這些相同的部分被作為一個類驅(qū)動器和其它部分分開。例如:
所有的IDE驅(qū)動器共享大部分的代碼,這樣就只用一次編寫好這些公用的代碼,把它作為一般的類驅(qū)動器加載。對于一個指定的設(shè)備,我們就只用編寫以類驅(qū)動
器為基礎(chǔ)的迷你驅(qū)動程序就可以了。
過濾驅(qū)動器可以截取程序?qū)Υ嬖诘尿?qū)動程序發(fā)出的請求。在請求到達驅(qū)動程序之前,它給我們一個更改請求內(nèi)容的機會。
事實上,在Windows驅(qū)動模式的世界中,中間層驅(qū)動程序也是由基本的驅(qū)動程序所組成,這些驅(qū)動程序可能即不是類驅(qū)動器,也不是迷你驅(qū)動器,但是,它
們縱是扮演著轉(zhuǎn)換抽象的I/O請求到低層物理驅(qū)動器代碼的角色。在DDK的文獻中,迷你驅(qū)動器和類驅(qū)動器的術(shù)語有時顛倒了,但從上下文可以分辨出來。
低層驅(qū)動器包括硬件和總線的控制器。例如: SCSI適配器是一個低層驅(qū)動器,這些低層驅(qū)動器和HAL于硬件結(jié)合緊密。在WDM中低層驅(qū)動器包括物理驅(qū)動器的概念,行為。這些物理驅(qū)動器與一個或者多個功能驅(qū)動器結(jié)合。圖1.4是WIN2000的分層驅(qū)動器總圖。

圖1.4 WIN2000的分層驅(qū)動器
特殊驅(qū)動器結(jié)構(gòu)
除了上節(jié)介紹的驅(qū)動器外,WIN2000還提供一些特殊的驅(qū)動器:
視頻驅(qū)動程序,打印機驅(qū)動程序,多媒體驅(qū)動程序,網(wǎng)絡(luò)驅(qū)動程序。
視頻驅(qū)動程序
視頻驅(qū)動程序非常特殊,因為圖形接口經(jīng)常暴露給用戶,系統(tǒng)的速度也是通過這個部分判斷的。
WIN2000視頻驅(qū)動程序構(gòu)架如圖1.5所示,陰影部分為WIN2000所有,視頻驅(qū)動程序為廠商提供,因為很多視頻適配器選用相同的視頻芯片,視頻
芯片制造商提供給視頻適配器制造商的是類(CLASS)驅(qū)動程序,例如: ET4000 MINI
驅(qū)動程序提供給所有使用ET4000芯片的視頻適配器,這個芯片的其它硬件環(huán)境的驅(qū)動程序則是視頻適配器自己的驅(qū)動代碼。
基本的,視頻驅(qū)動程序在請求畫圖系統(tǒng)服務(wù)的時候可以直接和I/O管理器通訊,這點和一般的I/O構(gòu)架是不同的。用戶模式的代碼通常和GDI交互。
GDI函數(shù)支持畫線,幾何圖形,文字。因此,GDI好象一個高層驅(qū)動器,GDI也依賴I/O管理器和顯示驅(qū)動來完成工作,顯示驅(qū)動和GDI的通訊是雙向
的。GDI可直接調(diào)用顯示驅(qū)動的函數(shù),這里的速度是致關(guān)重要的。這些函數(shù)是顯示驅(qū)動的驅(qū)動驅(qū)動接口(DDI),前綴是Drv,相反的,顯示驅(qū)動需要GDI
中的圖形庫例程,叫做圖形引擎調(diào)用(GEC),前綴是Eng。
GDI通過傳統(tǒng)分層的設(shè)計來訪問I/O子系統(tǒng),GDI使用I/O管理器去調(diào)用MINI 驅(qū)動程序和視頻口的例程,例如: 模式開關(guān)命令,它被傳給視頻口驅(qū)動器的是標(biāo)準(zhǔn)的IRP格式,視頻口驅(qū)動器轉(zhuǎn)換IRP格式為視頻請求包格式,然后傳給MINI 驅(qū)動程序處理。
圖1.5 WIN2000視頻驅(qū)動程序構(gòu)架
打印機驅(qū)動程序
打印機驅(qū)動程序與標(biāo)準(zhǔn)的WIN2000驅(qū)動程序有以下幾點不同:
1.假脫機: 一個打印工作在傳送到物理打印機之前先傳送到假脫機,因為物理打印機的速度太慢。
2.遠程操作: 物理打印機通常被連接到一個遠程計算器上,這里用到RPC.
3.不定的打印協(xié)議: 不同的打印機當(dāng)然有不同的打印協(xié)議。
假脫機部分如圖1.6所示,以后不再重復(fù)說明,陰影部分為WIN2000所有,如果假脫機被擊活,打印工作先被假脫機紀(jì)錄進一個文件,假脫機像打印機一樣退出隊列,而后變的可用,這時數(shù)據(jù)才被傳入本地或者遠程的打印機驅(qū)動。
圖1.5 打印機驅(qū)動程序的假脫機
客戶端的假脫機部分(winspool.drv 或者 Win32spl.DLL(遠程打印時)),是一個以RPC為基礎(chǔ)的程序,它連接服務(wù)端(Spoolsv.exe)和假脫機的API函數(shù)。
服務(wù)端的代碼依賴路由服務(wù)器(spoolss.dll),
這個路由服務(wù)器連接一個打印提供者,打印提供者是指定的打印機服務(wù)或者驅(qū)動程序的抽象。打印提供者創(chuàng)建和管理一個指定的打印工作隊列。一個簡單的打印提供
者可以向整個打印機類提供服務(wù),本地,遠程,網(wǎng)絡(luò)的打印提供者都被包含在WIN2000中。
不同的打印機,網(wǎng)絡(luò)協(xié)議有時需要特殊的打印提供者,例如: Novell INC 提供給WIN2000設(shè)計了一個直接輸出到網(wǎng)絡(luò)打印服務(wù)的打印提供者。
GDI必須轉(zhuǎn)換程序的畫圖命令成為打印機使用的特殊格式,GDI依靠打印機驅(qū)動程序工作, 打印機驅(qū)動程序由打印機繪圖DLL和打印機接口DLL組成。
打印機繪圖DLL負責(zé)給指定的打印機轉(zhuǎn)換數(shù)據(jù),在WIN2000中,打印機繪圖DLL可以放置在用戶模式或者內(nèi)核模式中,用戶模式放置在可以產(chǎn)生高的系統(tǒng)可靠性和靈活的配置。
打印機繪圖DLL的接口函數(shù)的前綴是Drv,這些接口函數(shù)在GDI轉(zhuǎn)換命令時被調(diào)用。
打印機繪圖DLL負責(zé)依照用戶的參數(shù)配置打印機設(shè)備,例如: 多進紙盒的打印機需要被設(shè)定缺省的紙張大小和進紙盒。打印機繪圖DLL通過構(gòu)建一個或者多個配置窗體的形式提供給用戶接口,這些配置窗體上有一些標(biāo)準(zhǔn)的Windows控件,通過它可以方便的配置打印機。
多媒體驅(qū)動程序
Windows
2000提供了內(nèi)核流(KS)去支持多媒體驅(qū)動程序像聲卡驅(qū)動程序,電視卡驅(qū)動程序等。KS由過濾驅(qū)動程序和功能驅(qū)動程序組成,應(yīng)用軟件將KS和方法,事
件,等來自組件對象模型(COM)的東西于KS結(jié)合,這些機制應(yīng)用于四種提供給應(yīng)用程序的KS對象: 過濾器,針腳,時鐘,分配算符。每一個提供給應(yīng)用程
序的KS對象都是一個標(biāo)準(zhǔn)的I/O文件對象。
過濾器對象(FILTER)(用以區(qū)別過濾器驅(qū)動程序)是顯露給用戶的執(zhí)行多媒體操作的高層實體,例如: 應(yīng)用程序可以打開一個聲卡的話筒過濾器。
針腳對象(PINS)是FILTER的子對象,它是設(shè)備的一個節(jié)點(輸入或者輸出),例如: 一個話筒過濾器可能給輸入提供一個針腳對象,一個輸出針腳對象然后去獲得(讀)那個數(shù)字化的信號。
時鐘對象(CLOCK)給多媒體設(shè)備提供(在有請求時鐘的情況下)一個實時鐘,當(dāng)時間到的情況下,時鐘對象將發(fā)送給應(yīng)用程序一個事件。
分配算符對象(Allocator)給多媒體設(shè)備提供一個直接內(nèi)存接口。這些內(nèi)存可以通過Allocator去分配或者釋放。
Windows
2000擁有一個通用的類驅(qū)動器Stream.sys,在多數(shù)情況下,必須編寫一個MINI驅(qū)動器去支持指定的像聲卡,攝像機的設(shè)備。制造商提供的
MINI驅(qū)動器利用類驅(qū)動器(包括緩沖器和DMA支持)去支持設(shè)備指定的動作,類驅(qū)動器執(zhí)行Windows 2000的KS的抽象。
網(wǎng)絡(luò)驅(qū)動程序
網(wǎng)絡(luò)驅(qū)動程序使用ISO的開放的系統(tǒng)互連網(wǎng)羅標(biāo)準(zhǔn)(OSI),這是一個七層的模型,它的頂層是應(yīng)用軟件層,底層是硬件連接和網(wǎng)絡(luò)的拓撲結(jié)構(gòu),網(wǎng)絡(luò)接口卡(NIC)給大多數(shù)的平臺提供網(wǎng)絡(luò)的硬件接口,網(wǎng)絡(luò)驅(qū)動程序是寫給指定的NIC的驅(qū)動程序。
網(wǎng)絡(luò)驅(qū)動程序接口規(guī)范(NDIS)給NIC驅(qū)動程序提供庫支持,通常只允許NIC廠商提供管理硬件特殊細節(jié)的MINI驅(qū)動程序,更高層的NDIS(中間驅(qū)動程序,協(xié)議驅(qū)動程序)在需要的時候提供媒體轉(zhuǎn)換,過濾。分層的NDIS如圖1.7所示。
WIN2000提供一個分層的內(nèi)核模式軟件傳輸驅(qū)動接口(TDI),這個分層的在NDIS層和高層軟件抽象像插座和NetBIOS,TDI層使WIN2000的高層結(jié)構(gòu)具有更多的可移植性。
圖1.7網(wǎng)絡(luò)驅(qū)動程序接口規(guī)范
小結(jié)
WIN2000為應(yīng)用程序的開發(fā)提供充足的體系結(jié)構(gòu),當(dāng)然,這需要驅(qū)動程序開發(fā)者花費巨大的心血。WIN2000 I/O處理過程圖解是復(fù)雜的,但是必須的。這是對理解WIN2000中有什幺驅(qū)動器,以及這些驅(qū)動器在什幺位置是有益的。