Windows2000設備驅動程序的研制開發_第1頁
Windows2000設備驅動程序的研制開發_第2頁
Windows2000設備驅動程序的研制開發_第3頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Windows2000設備驅動程序的研制開發

引言:由于工作關系,我經常涉及PC機與外圍設備接口的工作,從PC機這方面要做的工作看來,主要是通過接口處理外圍設備的中斷,通過I/O端口或內存地址與外設互相傳遞數據。從計算機原理的角度看,所要達到的目的很簡單,那么如何編寫程序完成上述功能呢?目前國內流行的PC操作系統有三種:DOS,Win95/98系列,WindowsNT。DOS是單用戶、單任務操作系統,由于PC機硬件處理速度不斷提高,基于單用戶、單任務的操作系統越來越不能充分發揮硬件的功能,現在只應用于一些老式PC及其它個別場合,有逐漸被淘汰的趨勢;Win95/98系列和WindowsNT屬于多任務操作系統,不論從其原理還是界面上看,這兩種操作系統都比DOS有著無可比擬的優越性,這兩種操作系統雖然在界面和操作上及其相似,但其內部實現的諸多方面有許多區別,有些區別是本質上的。Win95/98設計目標是針對一般家庭用戶,安全性及可靠性存在許多薄弱環節,就可靠性而言,Win95/98系列不能很好的防止多任務環境中某個進程的非法操作導致系統中其它程序甚至整個系統的崩潰,而WindowsNT在這方面及其它諸多方面設計的相當嚴謹。這兩種操作系統是Microsoft公司同一時期的產品,但針對不同的使用群,所以在一些重要場合及生產實踐中應該選擇WindowsNT作為計算機的操作系統,此外,從發展趨勢來看,WindowsNT已經成為定型產品,具有相對穩定性。在不同操作系統下編寫驅動程序是有很大區別的,在DOS平臺上,應用程序和設備驅動程序之間沒有標準的接口,它們在外部表現為一個擴展名為EXE的文件,驅動程序的作用被柔和在應用程序中,這樣,應用程序為了使用不同廠商的同一類設備,必須了解這些設備在接口上具體的硬件實現,同時,對于一個特定型號的硬件產品,所有支持它的應用軟件中對于控制整個設備動作的這部分代碼,可能被多次重寫。這種情況不適應硬件及應用軟件的飛速發展。Windows系統在這方面,進行了根本性改進,把控制設備動作的這部分代碼獨立出來,提出了設備驅動程序的概念,驅動程序是應用程序和硬件設備之間的一個橋梁,應用程序與驅動程序之間有明確的接口,應用程序通過與驅動程序交換信息,達到控制外設的目的。接口定義的操作是面向設備的,這就是說,在應用程序的設計中,并不用關心對外設操作的具體硬件實現,只是對驅動程序發出一系列指令既可;驅動程序接受來自上層應用程序的指示,具體操縱實際硬件,完成用戶功能。具體實現上,Win95/98系列與WindowsNT又有所區別,WindowsNT是嚴格按照上述思路設計的;而Win95/98系列不那么嚴格,其支持上述思路,但同時應用程序也可以繞過驅動程序直接訪問實際物理I/O,這樣做,增加程序設計的靈活性,但同時,對系統可靠性造成一定隱患。這也正是Win95/98系列可靠性低于WinNT的原因之一。表1-1三種操作系統下訪問接口比較[注]‘所有’指I/O端口,RAM總線,中斷,DMA。WindowsNT設備驅動程序的組成原理WindowsNT操作系統結構分為用戶模式和內核模式,用戶模式下的編程為應用程序的設計,而開發設備驅動程序,則屬于內核模式下的編程,內核模式組件包括NTExecutive(ExXxx),內核(KeXxx),硬件抽象層(HalXxx)。其層次如圖2-1所示,其中NTExecutive包括幾個獨立的軟件組件,它們是系統服務接口(ZwXxx),對象管理器(ObXxx),配置管理器,進程管理器(PsXxx),安全監視器(SeXxx),虛擬空間管理器(MemXxx),本地進程調用,I/O管理器(IoXxx)。內核模式的系統服務并不是全部公開的,而是提供了一系列開發設備驅動程序需要的函數(上文括號內為函數形式,函數手冊參見[2]Kernel-ModeDrivers-Reference章節),換言之,這些函數功能是所有內核模式的系統服務功能的子集。驅動程序由一系列相對獨立的函數組成,由I/O管理器根據需要調用這些函數,對于一個需要處理中斷的最簡單的驅動程序也需要由以下幾個函數構成:1.DriverEntry()運行于PASSIVE_LEVEL驅動程序入口點,當驅動程序被手動或自動裝入系統后,驅動程序從這點開始執行,主要用于定位硬件資源,建立指向其它驅動程序函數的指針等其它初始化工作。2.XxUnload()運行于PASSIVE_LEVEL用于驅動程序從系統卸出之前,釋放由驅動程序占用的所有系統資源。3.XxIsr()運行于DIRQL中斷服務程序。4.XxDpcForIsr()運行于DISPATCH_LEVEL中斷服務程序后處理程序,以排隊方執行不太關鍵代碼的執行,由于排隊機制及優先級,不會造成代碼擁塞從而提高中斷服務程序的響應并且提高系統總體I/O吞吐率。5.XxOpen()運行于PASSIVE_LEVEL處理應用程序Win32函數CreateFile()請求。6.XxClose()運行于PASSIVE_LEVEL處理應用程序Win32函數CloseHandle()請求。7.XxDispatch()運行于PASSIVE_LEVEL處理應用程序Win32函數DeviceIoControl()請求,通過一系列自定義命令,驅動程序與應用程序交換特定的信息。WindowsNT使用一個抽象化的CPU優先級方案,IRQL代表中斷請求級,任一時刻CPU總處在某一級上,這個數越大,表示當前的任務重要性越大,如表2-1所示,從上至下IRQL越來越小。所有上述驅動程序的函數及內核模式函數都必須運行于各自的IRQL級上,如果違反這一調用規定,會造成系統崩潰。例如,中斷服務程序(XxIsr)運行于DIRQL及上,那幺在編寫中斷服務程序時,只能調用允許在這一級運行的內核模式函數(并不是所有內核模式函數都能運行于DIRQL級)。至于每個內核模式函數運行級別的說明,詳見[2]Kernel-ModeDrivers-Reference章節。WindowsNT是一多任務系統,許多設備的驅動程序同時存在系統中,這樣各個設備所占用的資源(中斷,I/O及RAM地址空間)很有可能沖突,如果設備驅動程序在運行之前不進行‘探測’而使用自己硬件設備的資源,有可能和系統內其它設備占用的資源沖突,后果不堪設想。WindowsNT通過注冊表管理硬件資源的占用信息,作為內核模式信任的組件,驅動程序使用硬件資源之前必須遵循‘查詢-申請-使用-釋放’的原則(如圖2-2所示)。表2-1WindowsNT設備驅動程序的編寫步驟與實例現以一實際例子簡要說明設備驅動程序的開發步驟,本例以CINRAD天氣雷達測試卡實際應用為原型,加以簡化、抽象。第一步,了解被控設備的接口情況。本例為一ISA卡,占用PC機9號中斷,I/O地址360H及RAM地址D0228H分別一個字空間。W

溫馨提示

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

評論

0/150

提交評論