Windows9x/NT及2000下中斷驅(qū)動(dòng)程序的統(tǒng)一化處理
Windows以其友好的圖形用戶界面,使得它不僅成為辦公管理首選的操作系統(tǒng),也日益受到工程技術(shù)人員的關(guān)注,逐漸取代DOS而成為主流的工程應(yīng)用控制平臺(tái)。但是,Windows系統(tǒng)為了保證平臺(tái)的安全與完整性,對(duì)系統(tǒng)底層操作采取了屏蔽的策略,利用VxD將用戶與硬件隔離開來。 在Windows9x(95、97、98)下,用戶如果需要實(shí)現(xiàn)對(duì)硬件的中斷、DMA或存儲(chǔ)空間物理地址等資源進(jìn)行訪問,必須通過設(shè)備驅(qū)動(dòng)程序來進(jìn)行硬件操作;而在WindowsNT下,即使是簡(jiǎn)單的I/O操作,也需要編寫驅(qū)動(dòng)程序方能與硬件打交道。
本文引用地址:http://www.ex-cimer.com/article/202698.htmWindows操作系統(tǒng)的主流目前是Windows9x和WindowsNT,而已經(jīng)推出的Windows2000是以WindowsNT為主要框架的。由于Windows9x和WindowsNT兩者在系統(tǒng)核心上有質(zhì)的不同,所以即使對(duì)于同樣一個(gè)硬件,在兩者下的驅(qū)動(dòng)程序也有很大的區(qū)別。因此,一般而言,需要針對(duì)不同的操作系統(tǒng)編寫不同的驅(qū)動(dòng)程序。
兼容X86指令的微機(jī)CPU運(yùn)行時(shí)有4個(gè)優(yōu)先級(jí),Ring0~Ring3。操作系統(tǒng)與驅(qū)動(dòng)程序運(yùn)行在Ring0級(jí),可以對(duì)所有硬件資源進(jìn)行控制;用戶程序運(yùn)行在Ring3級(jí),對(duì)資源控制受到一些限制。而對(duì)于Ring0級(jí)的驅(qū)動(dòng)程序而言,它的編寫和調(diào)試通常需要對(duì)操作平臺(tái)的運(yùn)行機(jī)制有較深的了解,從而要求程序開發(fā)者掌握Windows9x、NT及Windows2000的內(nèi)核管理機(jī)制,對(duì)于開發(fā)人員來講這有相當(dāng)大的難度。 在這里,筆者使用了美國(guó)Jungo公司出品的WinDriver工具包,利用其繞過了對(duì)操作系統(tǒng)內(nèi)核的學(xué)習(xí)掌握這個(gè)難點(diǎn),并且在不更改程序代碼的前提下,完成了在多個(gè)操作系統(tǒng)下對(duì)硬件中斷的一致處理,很方便地解決了硬件與程序在不同系統(tǒng)下的移植問題。
1 Windows下硬件中斷的管理機(jī)制
在多任務(wù)的環(huán)境里,硬件設(shè)備中斷管理程序是非常重要的系統(tǒng)級(jí)程序。它不僅要把硬件發(fā)生的中斷時(shí)間傳給相應(yīng)的驅(qū)動(dòng)程序,還要允許某些設(shè)備驅(qū)動(dòng)程序處理它們特殊的中斷服務(wù)。在Windows平臺(tái)下,VPICD(虛擬可編程中斷控制器)就是這樣的硬件設(shè)備管理程序,它負(fù)責(zé)管理所有的硬件中斷時(shí)間。VPICD通過一個(gè)缺省機(jī)制觸發(fā)駐留在VM(虛擬機(jī))內(nèi)的中斷處理函數(shù)。它完全允許VxD根據(jù)其需要而重載中斷處理函數(shù)。PC機(jī)的硬件中斷需要確定硬件中斷的IRQS(中斷申請(qǐng)?zhí)?,對(duì)一個(gè)特定的IRQ中斷源,VPICD或提供缺省的中斷處理函數(shù),或允許其它VxD重載中斷處理函數(shù)。
VPICD提供的缺省中斷處理是:首先置中斷禁止,再觸發(fā)相應(yīng)VM中的中斷處理函數(shù)。因?yàn)閂PICD實(shí)現(xiàn)了對(duì)PPIC(物理可編程中斷控制器,如8259中斷控制器)的虛擬化,所以當(dāng)VM中的中斷處理函數(shù)發(fā)送EOI(中斷處理結(jié)束指令)時(shí),VPICD即對(duì)PPIC發(fā)EOI指令。最后,VPICD控制處理函數(shù)的返回操作,恢復(fù)中斷,并置VM狀態(tài)為VM進(jìn)入中斷前的狀態(tài)。當(dāng)VPICD對(duì)某些中斷的缺省處理不夠充分或則不太合適時(shí),就需要親手編寫一個(gè)VxD,在其中實(shí)現(xiàn)中斷的虛擬化。VxD將決定如何處理硬件中斷以及如何調(diào)用VM中的中斷處理函數(shù)。
下面將要詳述的WinDriver對(duì)中斷處理作了很好的封裝,將對(duì)VPICD和VM的控制和處理以及某些特殊的驅(qū)動(dòng)要求封裝在經(jīng)過嚴(yán)格調(diào)試的WinDriver.vxd和WinDriver.sys中,并對(duì)調(diào)用驅(qū)動(dòng)程序的API(應(yīng)用編程接口)函數(shù)進(jìn)行了系統(tǒng)集成,讓使用者直接面對(duì)用高級(jí)語(yǔ)言集成好的類庫(kù)和函數(shù)接口,從而大大降低了程序開發(fā)的難度,縮短了開發(fā)周期。
2 WinDriver工具包簡(jiǎn)介
WinDriver是美國(guó)Jungo公司出品的用于編寫驅(qū)動(dòng)程序的一種工具包,主要針對(duì)ISA/PCI插卡,4.2版本以后還提供了USB的開發(fā)工具。最新版本4.40版所編寫的程序兼容性十分強(qiáng)大,包括了Windows9x、Windows NT、Windows2000、Windows CE、Linux、Solaris(Intel)、VxWorks (Intel) 、OS/2等諸多操作平臺(tái)。WinDriver主要包括一個(gè)WinDriverWizard、一個(gè)WinDriver發(fā)行包、多個(gè)公用程序以及大量的例程。
(1)WinDriverWizard
這是一個(gè)友好的Windows向?qū)Ы缑?。運(yùn)行WinDriverWizard,它可以讓你立即接觸到硬件而不用寫一句有關(guān)的代碼。這種便利來自于它的自動(dòng)檢測(cè)功能。對(duì)于ISA插卡,用戶可以直接利用它來讀寫卡上的內(nèi)存、I/O地址、寄存器以及偵聽中斷。對(duì)于PCI插卡,除了上面的基本功能外,還可以方便地讀寫PCI的配置信息。
在此之后,通過選擇“GenerateCode”選項(xiàng),WinDriverWizard會(huì)為你的插卡產(chǎn)生基本的程序代碼。4.2版本以后還提供了多種編程語(yǔ)言選擇,幾乎包括了所有流行的編程語(yǔ)言,如VC4?|VC6、Borland C++Builder3?|4、Pascal、Delphi、Linuxmake、Solariesmake等等。這就讓用戶不必去學(xué)新的編程語(yǔ)言,很容易地直接上手。
評(píng)論