新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Windows 2000內(nèi)核模式驅(qū)動程序設(shè)計(jì)

Windows 2000內(nèi)核模式驅(qū)動程序設(shè)計(jì)

作者: 時(shí)間:2012-05-15 來源:網(wǎng)絡(luò) 收藏

摘要:介紹了2000程序模型的基本結(jié)構(gòu)、設(shè)計(jì)和開發(fā)的基本問題。并以PCI接口的ATM信令接口卡開發(fā)的程序部分為例,簡單介紹了程序開發(fā)的方法和步驟.并介紹了驅(qū)動程序開發(fā)環(huán)境的設(shè)置及編譯方法。這種驅(qū)動的開發(fā)過程得到了簡化,并降低了其復(fù)雜性。

本文引用地址:http://butianyuan.cn/article/149059.htm

關(guān)鍵詞:2000;驅(qū)動程序模型;ATM信令接口

0引言

設(shè)備驅(qū)動程序是直接同硬件打交道的軟件模塊。在2000中,微軟公司在WindowsNT4.0的驅(qū)動程序結(jié)構(gòu)基礎(chǔ)上,同時(shí)引入了Windows9X的即插即入特性,推出了新的驅(qū)動程序結(jié)構(gòu)(WDM)。WDM通過提供一種靈活的方式來簡化驅(qū)動程序的開發(fā),在實(shí)現(xiàn)對新硬件支持的基礎(chǔ)上減少并降低所必須開發(fā)的驅(qū)動程序的數(shù)量和復(fù)雜性。在Windows2000中的驅(qū)動程序可以分為2大類:用戶驅(qū)動程序和模式的驅(qū)動程序。用戶模式驅(qū)動程序是與子系統(tǒng)特定相關(guān)的,它包含了Win32多媒體驅(qū)動程序、支持MS-DOS應(yīng)用程序的虛擬設(shè)備驅(qū)動程序VDD(VirtualDeviceDriver)。模式驅(qū)動程序有3種基本類型,每一種都有稍微不同的結(jié)構(gòu)和完全不同的功能,即最高層驅(qū)動程序(如文件系統(tǒng)驅(qū)動程序(FSD))、中間層驅(qū)動程序(例如虛擬磁盤、鏡像或設(shè)備類型特定的外圍設(shè)備)、底層驅(qū)動程序(例如PnP硬件總線驅(qū)動程序)。在Windows2000操作系統(tǒng)下的驅(qū)動程序開發(fā)分為3個(gè)主要的領(lǐng)域:WDM驅(qū)動程序、文件系統(tǒng)驅(qū)動程序和小端口驅(qū)動程序,見圖1。其中小端口驅(qū)動程序針對的是顯示設(shè)備、SCSI和網(wǎng)絡(luò)設(shè)備等特定領(lǐng)域;文件系統(tǒng)驅(qū)動程序針對的是存儲設(shè)備;WDM驅(qū)動程序針對的則是計(jì)算機(jī)應(yīng)用系統(tǒng)開發(fā)所面對的大多數(shù)情況。本文我們討論了WDM內(nèi)核模式的驅(qū)動的一般問題,雖然其他類型驅(qū)動程序與WDM內(nèi)核模式驅(qū)動程序開發(fā)有所不同,但只要掌握了WDM內(nèi)核模式驅(qū)動程序開發(fā)的基礎(chǔ),結(jié)合2種基本類型的本身特點(diǎn),就能夠很快掌握設(shè)計(jì)方法。

1WDM的基本原理

WDM是一個(gè)模塊化的、分層次類型的微型驅(qū)動程序結(jié)構(gòu),層次結(jié)構(gòu)如圖2所示,其中左邊是一個(gè)設(shè)備對象堆棧,右邊為驅(qū)動程序的分層結(jié)構(gòu)。在WDM驅(qū)動程序模型中,每個(gè)硬件至少要包含功能驅(qū)動程序和總線驅(qū)動程序2個(gè)層??偩€驅(qū)動程序?yàn)榭偩€上發(fā)現(xiàn)的每個(gè)設(shè)備創(chuàng)建物理設(shè)備對象PDO,每個(gè)功能設(shè)備驅(qū)動程序創(chuàng)建自己的功能設(shè)備對象FDO。在驅(qū)動程序中不是直接操作硬件,而是操作相應(yīng)的PDO與FDO。來自用戶模式API的I/O請求包(IRP)送到設(shè)備堆棧的最上層驅(qū)動程序,然后逐漸過濾到下層的驅(qū)動程序。每一層驅(qū)動程序都可以決定如何處理IRP。內(nèi)核模式的WDM驅(qū)動程序有著可移植性、可配置性、基于對象、包驅(qū)動等共有的屬性。

用戶態(tài)程序和內(nèi)核通過設(shè)備對象訪問設(shè)備驅(qū)動程序的設(shè)備。WDM驅(qū)動程序有2種方法提供

Win32程序可用的名稱,舊的方法是在驅(qū)動程序的設(shè)備創(chuàng)建時(shí),通過函數(shù)IoCreate-SymbolicLink創(chuàng)建一個(gè)符號鏈接名,新的方法是使用128位的設(shè)備接口標(biāo)識(GUID)。在驅(qū)動程序編寫中,該GUID可以通過Windows提供的guidgen.exe工具生成。

2WDM驅(qū)動程序的結(jié)構(gòu)及設(shè)計(jì)

內(nèi)核模式的驅(qū)動程序不同于常規(guī)的應(yīng)用程序,可以把一個(gè)完整的驅(qū)動程序看作是一個(gè)容器,它包含許多例程,當(dāng)操作系統(tǒng)遇到一個(gè)IRP時(shí),它就調(diào)用這個(gè)容器中的例程來執(zhí)行該IRP的各種操作。圖3表示了這一概念。在每一個(gè)WDM驅(qū)動程序中,都必須擁有DriverEntry、AddDevice、DispatchPnP、DispatchPower和DispatchWmi這5個(gè)例程,其他的例程則是可選的。需要對IRP排隊(duì)的驅(qū)動程序一般都有一個(gè)StartIo例程,執(zhí)行DMA傳輸?shù)尿?qū)動程序應(yīng)有一個(gè)AdapterControl例程。大部分能生成硬件中斷的設(shè)備,其驅(qū)動程序都有一個(gè)中斷服務(wù)例程(ISR)和一個(gè)延遲過程調(diào)用(DpcForIsr)例程。驅(qū)動程序一般都有幾個(gè)支持不同類型IRP的分發(fā)例程。WDM驅(qū)動程序開發(fā)者的主要任務(wù)就是為如圖3所示的容器選擇,并完成所需要的例程。

當(dāng)I/O管理器裝入驅(qū)動程序時(shí),它調(diào)用每個(gè)驅(qū)動程序必須有的DriverEntry例程,以用來初始化驅(qū)動程序范圍的數(shù)據(jù)結(jié)構(gòu)和資源。一般來說,在DriverEntry例程中通常完成以下功能:①找到所要控制的硬件;②在驅(qū)動程序?qū)ο笾性O(shè)置驅(qū)動程序的Dispatch-,AddDevice,Startio(如果有)和UN-LOAD(如果有)等分發(fā)例程的程序的入口點(diǎn);③建立所有驅(qū)動程序?qū)ο蠡蚱渌到y(tǒng)資源;④返回的NTSTATUS表明驅(qū)動程序是否成功裝入,并能接收和處理來自PnP管理器的配置、增加(AddDevice)及啟動其設(shè)備的請求。對于功能驅(qū)動程序,AddDevice函數(shù)的基本職責(zé)是創(chuàng)建一個(gè)設(shè)備對象并把它聯(lián)接到以PDO為底的設(shè)備堆棧中。分發(fā)(Dispatch)例程是設(shè)備驅(qū)動程序提供的主要函數(shù)。當(dāng)被調(diào)用去執(zhí)行一個(gè)I/O操作時(shí),Windows2000通過實(shí)現(xiàn)Dispatch例程來處理來自用戶模式應(yīng)用程序的請求或來自系統(tǒng)的其他地方的請求。

一個(gè)完整的驅(qū)動程序要完成以下工作:初始化;創(chuàng)建與刪除設(shè)備;處理應(yīng)用層程序的打開和關(guān)閉句柄的請求;處理應(yīng)用層程序的輸入/輸出請求;串行化對設(shè)備的訪問;訪問硬件;調(diào)用其他驅(qū)動程序;取消I/O請求;處理可熱插拔設(shè)備的加入和刪除事件;電源管理和WMI;對能夠產(chǎn)生中斷的設(shè)備進(jìn)行中斷處理。

操作系統(tǒng)使用I/O請求包(IRP)的數(shù)據(jù)結(jié)構(gòu)與內(nèi)核模式驅(qū)動程序通信。IRP是一個(gè)內(nèi)核對象,它是一個(gè)預(yù)先定義的數(shù)據(jù)結(jié)構(gòu),帶有一組對它進(jìn)行操作的I/O管理器例程。I/O管理器接收一個(gè)I/O請求后分配并初始化一個(gè)IRP。一個(gè)IRP有一個(gè)固定的首部和可變數(shù)目的IRP堆棧單元塊,每個(gè)堆棧單元塊都對應(yīng)一個(gè)將處理該IRP的驅(qū)動程序,因此這些堆棧塊至少應(yīng)與驅(qū)動程序堆棧中將要處理這一請求的驅(qū)動程序數(shù)目一樣多。每個(gè)I/O請求有一個(gè)主功能代碼(IRP_M(jìn)J_XXX),并可能有次功能代碼(IRP_M(jìn)N_XXX)。主功能代碼決定了該I/O請求調(diào)用的分發(fā)例程的驅(qū)動程序入口點(diǎn)。分發(fā)例程接收到I/O請求后進(jìn)行如下處理:確認(rèn)I/O請求的合法性;盡可能在分發(fā)例程中直接完成該I/O請求;如果該請求不能在驅(qū)動程序的分發(fā)例程中被處理完,驅(qū)動程序就把這個(gè)請求排進(jìn)隊(duì)列,以便以后完成處理。WDM驅(qū)動程序提供了2種I/O請求排隊(duì)的方法:I/O管理器管理的系統(tǒng)排隊(duì)和驅(qū)動程序自己管理的驅(qū)動程序排隊(duì)。

c++相關(guān)文章:c++教程



上一頁 1 2 3 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉