Windows2000設(shè)備驅(qū)動程序_第1頁
Windows2000設(shè)備驅(qū)動程序_第2頁
Windows2000設(shè)備驅(qū)動程序_第3頁
Windows2000設(shè)備驅(qū)動程序_第4頁
Windows2000設(shè)備驅(qū)動程序_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

Windows2000設(shè)備驅(qū)動程序

引言:

由于工作關(guān)系,我經(jīng)常涉及PC機與外圍設(shè)備接口的工作,從PC機這方面要做的工作看來,主要是通過接口處理外圍設(shè)備的中斷,通過I/O端口或內(nèi)存地址與外設(shè)互相傳遞數(shù)據(jù)。從計算機原理的角度看,所要達到的目的很簡單,那么如何編寫程序完成上述功能呢?

目前國內(nèi)流行的PC操作系統(tǒng)有三種:DOS,Win95/98系列,WindowsNT。DOS是單用戶、單任務(wù)操作系統(tǒng),由于PC機硬件處理速度不斷提高,基于單用戶、單任務(wù)的操作系統(tǒng)越來越不能充分發(fā)揮硬件的功能,現(xiàn)在只應(yīng)用于一些老式PC及其它個別場合,有逐漸被淘汰的趨勢;Win95/98系列和WindowsNT屬于多任務(wù)操作系統(tǒng),不論從其原理還是界面上看,這兩種操作系統(tǒng)都比DOS有著無可比擬的優(yōu)越性,這兩種操作系統(tǒng)雖然在界面和操作上及其相似,但其內(nèi)部實現(xiàn)的諸多方面有許多區(qū)別,有些區(qū)別是本質(zhì)上的。Win95/98設(shè)計目標(biāo)是針對一般家庭用戶,安全性及可靠性存在許多薄弱環(huán)節(jié),就可靠性而言,Win95/98系列不能很好的防止多任務(wù)環(huán)境中某個進程的非法操作導(dǎo)致系統(tǒng)中其它程序甚至整個系統(tǒng)的崩潰,而WindowsNT在這方面及其它諸多方面設(shè)計的相當(dāng)嚴(yán)謹(jǐn)。這兩種操作系統(tǒng)是Microsoft公司同一時期的產(chǎn)品,但針對不同的使用群,所以在一些重要場合及生產(chǎn)實踐中應(yīng)該選擇WindowsNT作為計算機的操作系統(tǒng),此外,從發(fā)展趨勢來看,WindowsNT已經(jīng)成為定型產(chǎn)品,具有相對穩(wěn)定性。

在不同操作系統(tǒng)下編寫驅(qū)動程序是有很大區(qū)別的,在DOS平臺上,應(yīng)用程序和設(shè)備驅(qū)動程序之間沒有標(biāo)準(zhǔn)的接口,它們在外部表現(xiàn)為一個擴展名為EXE的文件,驅(qū)動程序的作用被柔和在應(yīng)用程序中,這樣,應(yīng)用程序為了使用不同廠商的同一類設(shè)備,必須了解這些設(shè)備在接口上具體的硬件實現(xiàn),同時,對于一個特定型號的硬件產(chǎn)品,所有支持它的應(yīng)用軟件中對于控制整個設(shè)備動作的這部分代碼,可能被多次重寫。這種情況不適應(yīng)硬件及應(yīng)用軟件的飛速發(fā)展。Windows系統(tǒng)在這方面,進行了根本性改進,把控制設(shè)備動作的這部分代碼獨立出來,提出了設(shè)備驅(qū)動程序的概念,驅(qū)動程序是應(yīng)用程序和硬件設(shè)備之間的一個橋梁,應(yīng)用程序與驅(qū)動程序之間有明確的接口,應(yīng)用程序通過與驅(qū)動程序交換信息,達到控制外設(shè)的目的。接口定義的操作是面向設(shè)備的,這就是說,在應(yīng)用程序的設(shè)計中,并不用關(guān)心對外設(shè)操作的具體硬件實現(xiàn),只是對驅(qū)動程序發(fā)出一系列指令既可;驅(qū)動程序接受來自上層應(yīng)用程序的指示,具體操縱實際硬件,完成用戶功能。具體實現(xiàn)上,Win95/98系列與WindowsNT又有所區(qū)別,WindowsNT是嚴(yán)格按照上述思路設(shè)計的;而Win95/98系列不那么嚴(yán)格,其支持上述思路,但同時應(yīng)用程序也可以繞過驅(qū)動程序直接訪問實際物理I/O,這樣做,增加程序設(shè)計的靈活性,但同時,對系統(tǒng)可靠性造成一定隱患。這也正是Win95/98系列可靠性低于WinNT的原因之一。

WindowsNT設(shè)備驅(qū)動程序的組成原理

WindowsNT操作系統(tǒng)結(jié)構(gòu)分為用戶模式和內(nèi)核模式,用戶模式下的編程為應(yīng)用程序的設(shè)計,而開發(fā)設(shè)備驅(qū)動程序,則屬于內(nèi)核模式下的編程,內(nèi)核模式組件包括NTExecutive,內(nèi)核,硬件抽象層。其層次如圖2-1所示,其中NTExecutive包括幾個獨立的軟件組件,它們是系統(tǒng)服務(wù)接口,對象管理器,配置管理器,進程管理器,安全監(jiān)視器,虛擬空間管理器,本地進程調(diào)用,I/O管理器。內(nèi)核模式的系統(tǒng)服務(wù)并不是全部公開的,而是提供了一系列開發(fā)設(shè)備驅(qū)動程序需要的函數(shù),換言之,這些函數(shù)功能是所有內(nèi)核模式的系統(tǒng)服務(wù)功能的子集。

驅(qū)動程序由一系列相對獨立的函數(shù)組成,由I/O管理器根據(jù)需要調(diào)用這些函數(shù),對于一個需要處理中斷的最簡單的驅(qū)動程序也需要由以下幾個函數(shù)構(gòu)成:

運行于PASSIVE_LEVEL

驅(qū)動程序入口點,當(dāng)驅(qū)動程序被手動或自動裝入系統(tǒng)后,驅(qū)動程序從這點開始執(zhí)行,主要用于定位硬件資源,建立指向其它驅(qū)動程序函數(shù)的指針等其它初始化工作。

運行于PASSIVE_LEVEL

用于驅(qū)動程序從系統(tǒng)卸出之前,釋放由驅(qū)動程序占用的所有系統(tǒng)資源。

運行于DIRQL

中斷服務(wù)程序。

運行于DISPATCH_LEVEL

中斷服務(wù)程序后處理程序,以排隊方執(zhí)行不太關(guān)鍵代碼的執(zhí)行,由于排隊機制及優(yōu)先級,不會造成代碼擁塞從而提高中斷服務(wù)程序的響應(yīng)并且提高系統(tǒng)總體I/O吞吐率。

運行于PASSIVE_LEVEL

處理應(yīng)用程序Win32函數(shù)CreateFile請求。

運行于PASSIVE_LEVEL

處理應(yīng)用程序Win32函數(shù)CloseHandle請求。

運行于PASSIVE_LEVEL

處理應(yīng)用程序Win32函數(shù)DeviceIoControl請求,通過一系列自定義命令,驅(qū)動程序與應(yīng)用程序交換特定的信息。

WindowsNT使用一個抽象化的CPU優(yōu)先級方案,IRQL代表中斷請求級,任一時刻CPU總處在某一級上,這個數(shù)越大,表示當(dāng)前的任務(wù)重要性越大,如表2-1所示,從上至下IRQL越來越小。所有上述驅(qū)動程序的函數(shù)及內(nèi)核模式函數(shù)都必須運行于各自的IRQL級上,如果違反這一調(diào)用規(guī)定,會造成系統(tǒng)崩潰。例如,中斷服務(wù)程序運行于DIRQL及上,那幺在編寫中斷服務(wù)程序時,只能調(diào)用允許在這一級運行的內(nèi)核模式函數(shù)。至于每個內(nèi)核模式函數(shù)運行級別的說明,詳見[2]Kernel-ModeDrivers-Reference章節(jié)。

WindowsNT是一多任務(wù)系統(tǒng),許多設(shè)備的驅(qū)動程序同時存在系統(tǒng)中,這樣各個設(shè)備所占用的資源很有可能沖突,如果設(shè)備驅(qū)動程序在運行之前不進行‘探測’而使用自己硬件設(shè)備的資源,有可能和系統(tǒng)內(nèi)其它設(shè)備占用的資源沖突,后果不堪設(shè)想。WindowsNT通過注冊表管理硬件資源的占用信息,作為內(nèi)核模式信任的組件,驅(qū)動程序使用硬件資源之前必須遵循‘查詢-申請-使用-釋放’的原則

WindowsNT設(shè)備驅(qū)動程序的編寫步驟與實例

現(xiàn)以一實際例子簡要說明設(shè)備驅(qū)動程序的開發(fā)步驟,本例以CINRAD天氣雷達測試卡實際應(yīng)用為原型,加以簡化、抽象。

第一步,了解被控設(shè)備的接口情況。

本例為一ISA卡,占用PC機9號中斷,I/O地址360H及RAM地址D0228H分別一個字空間。

第二步,確定驅(qū)動程序的功能。

驅(qū)動程序每當(dāng)9號中斷達到時,檢查運行標(biāo)志變量RunFlag,如果等于TRUE,中斷累積計數(shù)器counter增一,把這個值寫入RAM地址D0228H,再從這個地址讀出,如果讀出值等于寫入值,把這個值寫入I/O地址360H,這個地址的內(nèi)容會驅(qū)動板卡上的LED顯示,把寫入值顯示出來;如果讀出值不等于寫入值,設(shè)置運行標(biāo)志變量FALSE。如果運行標(biāo)志變量等于FALSE,什幺也不做,返回。

第三步,定義驅(qū)動程序與應(yīng)用程序的軟件接口。

本例定義兩個接口命令:

IOCTL_IOCardA_START:應(yīng)用程序設(shè)置驅(qū)動程序內(nèi)部的運行標(biāo)志變量等于TRUE。

IOCTL_IOCardA_READ:應(yīng)用程序查詢驅(qū)動程序內(nèi)部的中斷累積計數(shù)器的值。

第四步,畫流程圖。這里列舉本例實現(xiàn)的幾個主要流程圖,。

系統(tǒng)傳給驅(qū)動程序入口函數(shù)系統(tǒng)定義的‘設(shè)備驅(qū)動對象’DrObj,通過初始化這個對象的一些成員變量,把驅(qū)動程序其它函數(shù)與這個對象聯(lián)系起來。

ISA卡為非即插即用設(shè)備,事先把資源占用信息手工添加注冊表如下:

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesIOCardAparameters]

"IRQ"=dword:00000009

"IOSPAN"=dword:00000004

"IOAdd"=dword:00000360

"RAMAdd"=dword:000d0228

"RAMSPAN"=dword:00000002

其中IOCardA以下各子鍵及其值為自定義,設(shè)備驅(qū)動程序利用相應(yīng)函數(shù)檢索出這些值。

每個設(shè)備驅(qū)動程序可以創(chuàng)建若干系統(tǒng)定義的‘設(shè)備對象’,本例根據(jù)需要只創(chuàng)建了一個‘設(shè)備對象’Dev?!O(shè)備對象’其中一個成員變量為指向一非分頁的物理內(nèi)存塊DeviceExtension,這塊內(nèi)存大小及內(nèi)容為用戶自定義,由于Dev或DeviceExtension對象會被系統(tǒng)傳給驅(qū)動程序的其它函數(shù),這樣驅(qū)動程序各函數(shù)通過訪問這塊內(nèi)存區(qū),實際上達到互相傳遞信息的功能。本例在這里存儲設(shè)備硬件資源信息及RunFlag和中斷計數(shù)器counter,這些數(shù)值在DriverEntry初始化后,供驅(qū)動程序的其它函數(shù)使用。

圖3-2為中斷服務(wù)程序IOCardAIsr流程圖。操作系統(tǒng)接受中斷,連同DeviceExtension等參數(shù)傳給中斷服務(wù)程序,中斷服務(wù)程序利用這些參數(shù),實現(xiàn)要求功能。

圖3-3為IOCardADispatch流程圖,這個函數(shù)用于處理來自上層應(yīng)用程序的命令。上層應(yīng)用程序通過以下程序段設(shè)置驅(qū)動程序中RunFlag值為TRUE,從而啟動中斷服務(wù)程序開始計數(shù)。

BOOLcmd=TRUE;

hTest=CreateFile;//打開設(shè)備

DeviceIoControl,//輸入緩沖區(qū)地址及大小

NULL,0,&c,NULL);

CloseHandle;//關(guān)閉設(shè)備

上層應(yīng)用程序通過以下程序段查詢當(dāng)前的中斷計數(shù)器的值并存于變量w中。

unsignedshortw;

hTest=CreateFile;

DeviceIoControl,//輸出緩沖區(qū)地址及大小

&c,NULL);

CloseHandle;

其中DeviceIoControl執(zhí)行后,操作系統(tǒng)調(diào)用IOCardADispatch函數(shù),如流程圖所示,這個函數(shù)內(nèi)部通過一個開關(guān)語句,根據(jù)命令執(zhí)行相應(yīng)的分支。驅(qū)動程序與應(yīng)用程序通過此函數(shù)接口交換數(shù)據(jù)時,操作系統(tǒng)提供4種可選數(shù)據(jù)緩沖方式,本例由于數(shù)據(jù)I/O量比較小,故選用‘緩沖I/O’。過程是,I/O管理器首先分配一個非分頁池,它的大小為調(diào)用者輸入緩沖區(qū)和輸出緩沖區(qū)的較大者,第一段程序為sizeof,第二段程序為sizeof,它的地址存到IRP的域中,然后把輸入數(shù)據(jù)拷貝到這個池中,在第一段程序中cmd的值TRUE被拷貝到池中,這樣驅(qū)動程序通過RtlCopyBytes函數(shù)再把池中的值拷貝到驅(qū)動程序的RunFlag中。IOCardADispatch函數(shù)執(zhí)行完,I/O管理器把池中的內(nèi)容拷貝到調(diào)用者的輸出緩沖區(qū),在第二段程序中,驅(qū)動程序通過RtlCopyBytes函數(shù)把counter的值拷貝到池中,從而最終傳遞到應(yīng)用程序變量w中。

第五步,編程。在編寫設(shè)備驅(qū)動程序的同時,要編寫一個簡單的應(yīng)用程序用于測試設(shè)備驅(qū)動程序的一些功能。

第六步,驅(qū)動程序的載入。

驅(qū)動程序C語言源程序經(jīng)過編譯、連接生成擴展名為SYS的文件,本例為,把這個文件拷貝到WINNTsystem32drivers系統(tǒng)目錄下,同時手工添加如下信息到注冊表:

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesIOCardA]

"ErrorControl"=dword:00000001

"Start"=dword:00000003

"Type"=dword:00000001

要保證IOCardA子鍵名與驅(qū)動程序文件名一致,其中Type=1表示此驅(qū)動程序為內(nèi)核模式驅(qū)動程序,Start=3表示此驅(qū)動程序手動載入,ErrorControl=1表示當(dāng)驅(qū)動程序發(fā)生錯誤時,日志記錄錯誤并顯示一個消息框。這樣當(dāng)Windows重新啟動后,通過使用控制面板中的Device小應(yīng)用程序,從列表中找到IOCardA設(shè)備名,按Start按鈕,于是,設(shè)備驅(qū)動程序就駐留內(nèi)存并在底層開始工作了。

第七,調(diào)試。設(shè)備驅(qū)動程序沒有界面,完全在系統(tǒng)底層運行,為了觀察驅(qū)動程序的運行狀態(tài),WindowsNTDDK提供程序用于設(shè)備驅(qū)動程序的調(diào)試,調(diào)試設(shè)備驅(qū)動程序需要兩臺CPU體系結(jié)構(gòu)完全相同的計算機,一臺為‘宿主機’,運行程序,另一臺為‘目標(biāo)機’,運行設(shè)備驅(qū)動程序,兩臺計算機用串口線連好,進行一系列軟件設(shè)置,就可以開始調(diào)試了,從‘宿主機’可以控制及觀察‘目標(biāo)機’上驅(qū)動程序的運行情況。最常用的調(diào)試手段是在驅(qū)動程序中必要的位置加入DbgPrint函數(shù),這個函數(shù)可以把指

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論