<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁 > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > Windows9x/NT及2000下中斷驅(qū)動(dòng)程序的統(tǒng)一化處理

          Windows9x/NT及2000下中斷驅(qū)動(dòng)程序的統(tǒng)一化處理

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

          以其友好的圖形用戶界面,使得它不僅成為辦公管理首選的操作系統(tǒng),也日益受到工程技術(shù)人員的關(guān)注,逐漸取代DOS而成為主流的工程應(yīng)用控制平臺(tái)。但是,系統(tǒng)為了保證平臺(tái)的安全與完整性,對(duì)系統(tǒng)底層操作采取了屏蔽的策略,利用VxD將用戶與硬件隔離開來。 在9x(95、97、98)下,用戶如果需要實(shí)現(xiàn)對(duì)硬件的、DMA或存儲(chǔ)空間物理地址等資源進(jìn)行訪問,必須通過設(shè)備驅(qū)動(dòng)程序來進(jìn)行硬件操作;而在Windows下,即使是簡(jiǎn)單的I/O操作,也需要編寫驅(qū)動(dòng)程序方能與硬件打交道。

          本文引用地址:http://www.ex-cimer.com/article/202698.htm

            Windows操作系統(tǒng)的主流目前是Windows9x和Windows,而已經(jīng)推出的Windows是以Windows為主要框架的。由于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及Windows的內(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í)語言集成好的類庫(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、Windows、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版本以后還提供了多種編程語言選擇,幾乎包括了所有流行的編程語言,如VC4?|VC6、Borland C++Builder3?|4、Pascal、Delphi、Linuxmake、Solariesmake等等。這就讓用戶不必去學(xué)新的編程語言,很容易地直接上手。


          上一頁 1 2 3 4 下一頁

          關(guān)鍵詞: Windows 2000 NT 中斷

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();