5.20日音訊,系統(tǒng)設(shè)備驅(qū)動程序分類。在WindowsI/O系統(tǒng)中,設(shè)備驅(qū)動程序不僅為操作系統(tǒng)提供了支持各種I/O設(shè)備的能力,也是Windows內(nèi)核本身擴(kuò)展的基礎(chǔ)。Windows可以動態(tài)地加載或卸載設(shè)備驅(qū)動程序,通過這些驅(qū)動程序來調(diào)整或擴(kuò)展內(nèi)核的功能。WindowsI/O系統(tǒng)規(guī)定了設(shè)備驅(qū)動程序應(yīng)遵循的接口,這組接口是通用的,可適用于所有的內(nèi)核模式驅(qū)動程序。設(shè)備驅(qū)動程序依據(jù)其用途不同,可以分為以下三類:
?即插即用驅(qū)動程序,也稱為WDM驅(qū)動程序。它們通常是為了驅(qū)動硬件設(shè)備而由硬件廠商提供,與Windows的I/O管理器、即插即用管理器和電源管理器一起工作。Windows自身攜帶了大量即插即用驅(qū)動程序,用于支持各種常見的存儲設(shè)備、視頻適配器、網(wǎng)絡(luò)適配器以及輸入設(shè)備等。
?內(nèi)核擴(kuò)展驅(qū)動程序,也稱為非即插即用驅(qū)動程序。它們擴(kuò)展內(nèi)核的功能,或者提供了訪問內(nèi)核模式代碼和數(shù)據(jù)的一種途徑。它們并沒有集成到即插即用管理器和電源管理器的管理框架中。早期的WindowsNT驅(qū)動程序(在引入即插即用管理機(jī)制以前)都屬于這一類型,現(xiàn)在仍然有大量的內(nèi)核擴(kuò)展驅(qū)動程序。本書前幾章展示的工具都通過這種類型的驅(qū)動程序來獲得內(nèi)核中的信息。
?文件系統(tǒng)驅(qū)動程序。它們接收針對文件的I/O請求,再進(jìn)一步將這些請求轉(zhuǎn)變成真正對于存儲設(shè)備或網(wǎng)絡(luò)設(shè)備的I/O請求,從而滿足客戶的原始請求。在6.2.1節(jié)我們曾經(jīng)看到過,文件系統(tǒng)類型的驅(qū)動程序被放在對象管理器的\FileSystem目錄下,其他的驅(qū)動程序放在\Driver目錄下。表6.2中列出的驅(qū)動程序都是文件系統(tǒng)驅(qū)動程序。
Windows驅(qū)動程序模型(WDM)在I/O模型中增加了對即插即用、電源管理和Windows管理規(guī)范(WMI)的支持。而且,遵從WDM的驅(qū)動程序在Windows平臺(包括Windows98/Windows2000以后的所有版本)上至少是源代碼兼容的,甚至也可能是二進(jìn)制兼容的。WDM驅(qū)動程序又進(jìn)一步可以劃分成以下三類:
?總線驅(qū)動程序。顧名思義,總線驅(qū)動程序管理一個總線設(shè)備,它負(fù)責(zé)檢測總線上附載的所有設(shè)備,并通知即插即用管理器關(guān)于這些設(shè)備的情況??偩€驅(qū)動程序也負(fù)責(zé)總線的電源管理。
?功能驅(qū)動程序。功能驅(qū)動程序管理具體的設(shè)備,在一個設(shè)備的設(shè)備棧中,功能驅(qū)動程序創(chuàng)建的設(shè)備對象(即FDO)相當(dāng)于操作系統(tǒng)控制該設(shè)備的邏輯接口。功能驅(qū)動程序是實(shí)際管理該設(shè)備的功能模塊。
?過濾驅(qū)動程序。在設(shè)備棧中,過濾驅(qū)動程序位于功能驅(qū)動程序之上或之下,它的用途是:監(jiān)視一個設(shè)備的I/O請求以及這些請求的處理情況,或者,增加或改變一個設(shè)備或另一個驅(qū)動程序的行為。例如,病毒掃描工具常常利用過濾驅(qū)動程序來監(jiān)視被讀寫的文件數(shù)據(jù)。
在WDM中,總線是指可供其他設(shè)備附載的設(shè)備,其中既有像PCI和SCSI這樣的物理總線設(shè)備,也有像HAL這樣的虛擬總線設(shè)備??偩€驅(qū)動程序負(fù)責(zé)檢測總線上的設(shè)備,并且協(xié)助即插即用管理器列舉這些設(shè)備,而且它也控制該總線的物理配置。相反地,功能驅(qū)動程序要簡單得多,通常只是控制一個設(shè)備的硬件而已。
在即插即用管理器列舉得到的設(shè)備樹中,每個設(shè)備節(jié)點(diǎn)都包含一個設(shè)備棧,設(shè)備棧中的各個設(shè)備對象分別由對應(yīng)的驅(qū)動程序創(chuàng)建和實(shí)現(xiàn)。圖6.12顯示了不同類型WDM驅(qū)動程序在設(shè)備棧中的角色,以及它們之間的關(guān)系。
每個設(shè)備對象都是由對應(yīng)的驅(qū)動程序創(chuàng)建的,設(shè)備的PDO是由總線驅(qū)動程序創(chuàng)建的,而FDO是由功能驅(qū)動程序創(chuàng)建的。在PDO和FDO之間,緊挨著PDO,可以有零個或多個總線過濾設(shè)備對象,它們由相應(yīng)的總線過濾驅(qū)動程序創(chuàng)建。在總線過濾設(shè)備對象和FDO之間,可以有零個或多個下層過濾設(shè)備對象。而在FDO之上,則可以有零個或多個上層過濾設(shè)備對象。這些下層或上層過濾設(shè)備對象分別由相應(yīng)的下層或上層過濾驅(qū)動程序創(chuàng)建。WDM規(guī)定了這樣的設(shè)備棧結(jié)構(gòu),既合理地讓參與其中的每個驅(qū)動程序?qū)崿F(xiàn)它所負(fù)責(zé)的那部分功能,也提供了足夠的擴(kuò)展性,允許過濾驅(qū)動程序在不同層次上監(jiān)視或修正一個設(shè)備的工作方式。后面6.5.4節(jié)將介紹過濾驅(qū)動程序的加載以及過濾設(shè)備對象的創(chuàng)建順序。
對于一個具體的設(shè)備而言,F(xiàn)DO代表了它對于操作系統(tǒng)的邏輯接口。功能驅(qū)動程序往往會創(chuàng)建一個代表相應(yīng)PDO的設(shè)備接口(通過I/O管理器函數(shù)IoRegisterDeviceInterface),因而應(yīng)用程序或內(nèi)核其他部分可以通過此設(shè)備接口與該設(shè)備打交道。對于一些復(fù)雜而又通用的設(shè)備,例如磁盤設(shè)備和網(wǎng)絡(luò)適配器等,功能驅(qū)動程序又被進(jìn)一步分成多個獨(dú)立的驅(qū)動程序,由它們聯(lián)合起來管理該FDO的I/O請求。從這一層意義上,WDM驅(qū)動程序?qū)τ布闹С挚梢赃M(jìn)一步劃分為類驅(qū)動程序(classdriver)和端口驅(qū)動程序(portdriver),以及小端口驅(qū)動程序(miniportdriver)。
類驅(qū)動程序?qū)崿F(xiàn)了某一種類型的設(shè)備的I/O處理。對于已經(jīng)標(biāo)準(zhǔn)化的設(shè)備類型,比如磁盤、網(wǎng)絡(luò)適配器等,提供一個類驅(qū)動程序可以為不同廠商生產(chǎn)的設(shè)備實(shí)現(xiàn)通用的服務(wù)。端口驅(qū)動程序?qū)崿F(xiàn)了與某一類型I/O端口相關(guān)的I/O處理,它們并不遵從驅(qū)動程序的接口要求,而只是一些內(nèi)核模式的輔助例程。小端口驅(qū)動程序則實(shí)現(xiàn)了驅(qū)動某一特定設(shè)備而需要的I/O服務(wù)。類驅(qū)動程序和小端口驅(qū)動程序的分工可以看成是針對一個或一類設(shè)備的“通用”和“特殊”的功能部分。類驅(qū)動程序?qū)崿F(xiàn)的是“通用”或“公共”的I/O服務(wù),而小端口驅(qū)動程序?qū)崿F(xiàn)的是針對某一特定設(shè)備的“特殊”功能部分。