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

下載本文檔

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

文檔簡介

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

引言:

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

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

在不同操作系統(tǒng)下編寫驅(qū)動程序是有很大區(qū)分的,在DOS平臺上,應(yīng)用程序和設(shè)備驅(qū)動程序之間沒有標(biāo)準(zhǔn)的接口,它們在外部表現(xiàn)為一個擴(kuò)展名為EXE的文件,驅(qū)動程序的作用被嚴(yán)厲在應(yīng)用程序中,這樣,應(yīng)用程序?yàn)榱耸褂貌煌瑥S商的同一類設(shè)備,必需了解這些設(shè)備在接口上詳細(xì)的硬件實(shí)現(xiàn),同時,對于一個特定型號的硬件產(chǎn)品,全部支持它的應(yīng)用軟件中對于掌握整個設(shè)備動作的這局部代碼,可能被屢次重寫。這種狀況不適應(yīng)硬件及應(yīng)用軟件的飛速進(jìn)展。Windows系統(tǒng)在這方面,進(jìn)展了根本性改良,把掌握設(shè)備動作的這局部代碼獨(dú)立出來,提出了設(shè)備驅(qū)動程序的概念,驅(qū)動程序是應(yīng)用程序和硬件設(shè)備之間的一個橋梁,應(yīng)用程序與驅(qū)動程序之間有明確的接口,應(yīng)用程序通過與驅(qū)動程序交換信息,到達(dá)掌握外設(shè)的目的。接口定義的操作是面對設(shè)備的,這就是說,在應(yīng)用程序的設(shè)計(jì)中,并不用關(guān)懷對外設(shè)操作的詳細(xì)硬件實(shí)現(xiàn),只是對驅(qū)動程序發(fā)出一系列指令既可;驅(qū)動程序承受來自上層應(yīng)用程序的指示,詳細(xì)操縱實(shí)際硬件,完成用戶功能。詳細(xì)實(shí)現(xiàn)上,Win95/98系列與WindowsNT又有所區(qū)分,WindowsNT是嚴(yán)格根據(jù)上述思路設(shè)計(jì)的;而Win95/98系列不那么嚴(yán)格,其支持上述思路,但同時應(yīng)用程序也可以繞過驅(qū)動程序直接訪問實(shí)際物理I/O,這樣做,增加程序設(shè)計(jì)的敏捷性,但同時,對系統(tǒng)牢靠性造成肯定隱患。這也正是Win95/98系列牢靠性低于WinNT的緣由之一。

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

WindowsNT操作系統(tǒng)構(gòu)造分為用戶模式和內(nèi)核模式,用戶模式下的編程為應(yīng)用程序的設(shè)計(jì),而開發(fā)設(shè)備驅(qū)動程序,則屬于內(nèi)核模式下的編程,內(nèi)核模式組件包括NTExecutive(ExXxx),內(nèi)核(KeXxx),硬件抽象層(HalXxx)。其層次如圖2-1所示,其中NTExecutive包括幾個獨(dú)立的軟件組件,它們是系統(tǒng)效勞接口(ZwXxx),對象治理器(ObXxx),配置治理器,進(jìn)程治理器(PsXxx),安全監(jiān)視器(SeXxx),虛擬空間治理器(MemXxx),本地進(jìn)程調(diào)用,I/O治理器(IoXxx)。內(nèi)核模式的系統(tǒng)效勞并不是全部公開的,而是供應(yīng)了一系列開發(fā)設(shè)備驅(qū)動程序需要的函數(shù)(上文括號內(nèi)為函數(shù)形式,函數(shù)手冊參見[2]Kernel-ModeDrivers-Reference章節(jié)),換言之,這些函數(shù)功能是全部內(nèi)核模式的系統(tǒng)效勞功能的子集。

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

1.DriverEntry()運(yùn)行于PASSIVE_LEVEL

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

2.XxUnload()運(yùn)行于PASSIVE_LEVEL

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

3.XxIsr()運(yùn)行于DIRQL

中斷效勞程序。

4.XxDpcForIsr()運(yùn)行于DISPATCH_LEVEL

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

5.XxOpen()運(yùn)行于PASSIVE_LEVEL

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

6.XxClose()運(yùn)行于PASSIVE_LEVEL

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

7.XxDispatch()運(yùn)行于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ù)都必需運(yùn)行于各自的IRQL級上,假如違反這一調(diào)用規(guī)定,會造成系統(tǒng)崩潰。例如,中斷效勞程序(XxIsr)運(yùn)行于DIRQL及上,那幺在編寫中斷效勞程序時,只能調(diào)用允許在這一級運(yùn)行的內(nèi)核模式函數(shù)(并不是全部內(nèi)核模式函數(shù)都能運(yùn)行于DIRQL級)。至于每個內(nèi)核模式函數(shù)運(yùn)行級別的說明,詳見[2]Kernel-ModeDrivers-Reference章節(jié)。

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

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

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

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

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

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

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

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

本例定義兩個接口命令:

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

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

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

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

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

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IOCardA\parameters]

“IRQ“=dword:00000009

“IOSPAN“=dword:00000004

“IOAdd“=dword:00000360

“RAMAdd“=dword:000d0228

“RAMSPAN“=dword:00000002

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

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

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

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

BOOLcmd=TRUE;

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

DeviceIoControl(hTest,//設(shè)備句柄

IOCTL_IOCardA_START,//命令

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

NULL,0,c,NULL);

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

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

unsignedshortw;

hTest=CreateFile(...);

DeviceIoControl(hTest,

IOCTL_IOCardA_READ,//命令

NULL,0,

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

c,NULL);

CloseHandle(hTest);

其中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)供應(yīng)4種可選數(shù)據(jù)緩沖方式,本例由于數(shù)據(jù)I/O量比擬小,應(yīng)選用‘緩沖I/O’(METHOD_BUFFERED)。過程是,I/O治理器首先安排一個非分頁池,它的大小為調(diào)用者輸入緩沖區(qū)和輸出緩沖區(qū)的較大者,第一段程序?yàn)閟izeof(BOOL),其次段程序?yàn)閟izeof(unsignedshort),它的地址存到IRP(I/O懇求包)的AssociatedIrp.SystemBuffer域中,然后把輸入數(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)過編譯、連接生成擴(kuò)展名為SYS的文件,本例為IOCardA.sys,把這個文件拷貝到\WINNT\system32\drivers\系統(tǒng)名目下,同時手工添加如下信息到注冊表:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IOCardA]

“ErrorControl“=dword:00000001

“Start“=dword:00000003

“Type“=dword:00000001

要保證IOCardA子鍵名與驅(qū)動程序文件名全都,其中Type=1表示此驅(qū)動程序?yàn)閮?nèi)核模式驅(qū)動程序,Start=3表示此驅(qū)動程序手動載入,E

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論