當前位置:首頁 > 嵌入式 > 嵌入式硬件
[導讀]摘 要: 介紹了Windows98的內(nèi)核管理機制和應用程序權限級別,簡述了在Windows98下進行虛擬驅動程序開發(fā)的幾種工具和編程方法,并給出了借助VToolsD用C++語言編寫的處理硬件

摘 要: 介紹了Windows98的內(nèi)核管理機制和應用程序權限級別,簡述了在Windows98下進行虛擬驅動程序開發(fā)的幾種工具和編程方法,并給出了借助VToolsD用C++語言編寫的處理硬件中斷的程序實例。

關鍵詞: 虛擬設備驅動程序 VToolsD 中斷服務例程

美國微軟公司出品的Windows98以其友好的圖形用戶界面,在我國贏得了廣泛的市場。在給廣大辦公環(huán)境工作人員帶來方便的同時,也給不少工程技術人員帶來了一些麻煩。一些原本在DOS下很容易編出的控制硬件的程序,現(xiàn)在在Windows98下就不那么容易實現(xiàn)了。作為一個完善的操作系統(tǒng)也必須能控制硬件,象DOS那樣直接與硬件打交道是Windows98不提倡的。它需要開發(fā)專門的硬件設備驅動程序,即通過一系列的虛擬設備驅動程序來管理硬件,如:進行中斷響應、I/O端口讀寫或直接存儲器存取(DMA)。Windows98內(nèi)核管理機制非常復雜,因而編寫虛擬驅動程序也變得十分困難,要想編寫虛擬驅動程序,就必須對Windows98的內(nèi)核有所了解。

1 Windows98的內(nèi)核管理機制

在Windows95三年后推出的Windows98雖然擴充了許多新的設備驅動特性,如對AGP、USB、DVD的支持,但在內(nèi)核上卻和 Windows95基本一樣,它們都是基于DOS內(nèi)核的操作系統(tǒng)。Windows98系統(tǒng)核心(Kernel)由虛擬機管理器(VMM)和 VxD(Virtual Device Driver)的集合組成。Kernel提供了900多個服務函數(shù)來管理內(nèi)存、控制物理設備、處理中斷、創(chuàng)建網(wǎng)絡協(xié)議棧、管理文件系統(tǒng)等,這些服務函數(shù)都可以被自己寫的VxD調(diào)用。虛擬機(VM)是一個可運行的任務,包含應用程序、支撐軟件、內(nèi)存和CPU寄存器。在Windows98下有系統(tǒng)虛擬機和 DOS虛擬機兩種。虛擬機管理器(VMM)是在系統(tǒng)級核心運行的32位保護模式操作系統(tǒng),它運行于Ring0,而且不可重入。VMM主要功能是創(chuàng)建、運行、監(jiān)控和終止虛擬機。VxD即虛擬設備驅動程序,是用來擴展Windows操作系統(tǒng)功能的一類程序。由于VxD運行在系統(tǒng)的Ring0級,擁有與操作系統(tǒng)同等的級別,所以我們可利用它來支持硬件設備的管理。虛擬可編程中斷控制器(VPICD)是負責管理所有硬件中斷事件的程序,它本身也是一種VxD,能提供缺省的中斷處理函數(shù)或者允許其它VxD重載中斷處理函數(shù)。

2 Windows98下應用程序權限級別

Intel的80x86CPU系列芯片可在三種模式下工作:實模式、保護模式和V86模式。實模式是MS-DOS的運行環(huán)境。Windows98只利用了兩種模式:保護模式和V86模式。保護模式給我們帶來很多優(yōu)越性,如應用程序不再受1M內(nèi)存的限制,理論上,在保護模式下,CPU可以進行4096M內(nèi)存的尋址。但在保護模式下,所有的應用程序都有權限級別(Privilege Level)。權限級別按優(yōu)先次序分為四等:0、1、2、3。0級是最高級別,操作系統(tǒng)就運行在0級,運行在Ring0級的應用程序可以執(zhí)行所有的指令并可直接對硬件、中斷和文件系統(tǒng)進行物理訪問。如果應用程序擁有的權限級別是第3級,那么它能執(zhí)行的指令是有限的,對硬件的很多直接操作是不能實現(xiàn)的。在 Windows中,一般的應用程序是運行在Ring3級的(如用Visual C++、Borland C++、Visual Basic、Delphi、C++ Builder等SDK工具開發(fā)出的應用程序)。它們享有的權限是最低的,受到了保護模式的摫;?,它們沒有權限去繞過操作系統(tǒng)直接對硬件操作。

有了權限級別,操作系統(tǒng)就有機會在中斷和I/O操作上產(chǎn)生撔檳鈹效果。由于操作系統(tǒng)的權限為0級,它就可以捕獲權限不為0級的應用程序的中斷和I/O請求,然后建立緩沖隊列,再一一進行串行處理。為了使自己的應用程序也能直接處理硬件,就需要編寫專門的VxD。由于VxD是作為操作系統(tǒng)的組件運行于第0 級,因而可以利用它來捕獲特定的硬件操作,完成我們需要的任務。

3 Windows98下虛擬設備驅動程序的開發(fā)工具和基本編程方法

微軟為驅動程序的開發(fā)提供了設備驅動程序工具箱(DDK),基于匯編語言的編程方式和許多VMM服務都使用寄存器的調(diào)用方式,確實非常難學,沒有深厚的匯編語言和硬件基礎很難在短時間里開發(fā)出自己的VxD。

美國Vireo Software公司推出的VToolsD為我們開發(fā)VxD提供了方便快捷的方法。程序員可利用C或C++語言編寫自己的VxD,而不必操心許多繁瑣的細節(jié)。它的基本編程方法是:用VToolsD自帶的Quick VxD程序快速生成程序框架,在VC++或Borland C++中打開此框架的工程文件,并寫進特定的處理代碼,編譯后就可得到所需的VxD文件。

4 一個中斷程序實例

用C或C++都可在VToolsD中進行開發(fā),相比之下,由于VToolsD中封裝許多C++類庫,因而用C++語言進行VxD的開發(fā)更加容易和方便。

在我們開發(fā)的小型實時光譜能量輻射儀中利用北京眾人公司的PS-2129AD采集卡作為數(shù)據(jù)采集器件??ㄉ陷d有三路8253計數(shù)器,利用其中的兩路產(chǎn)生光電二極管陣列(SSPD)的驅動信號,另外一路讓它工作在方式0椉剖?崾???卸希?康奔剖?當湮?埃?悴??卸希?謚卸銑絳蚶锝?惺?薟杉?1糾?兄卸蝦盼?埂?/P>

定義好設備屬性各參數(shù)后,在Quick VxD生成的頭文件中定義如下:

#define DEVICE_CLASS AdcardDevice

#define ADCARD_DeviceID UNDEFINED_DEVICE_ID

#define ADCARD_Init_Order UNDEFINED_INIT_ORDER

#define ADCARD_Major 1

#define ADCARD_Minor 0

#define MY_IRQ 9/*中斷號為9*/

其中ADCARD為在QuickVxD的對話框中鍵入的設備名。VToolsD提供類VHardwareInt來實現(xiàn)對某個IRQ端口的虛擬化,并處理該IRQ端口上的硬件中斷。本實例中就用到這個類。

類OnHaredwareInt的主要成員函數(shù)定義如下:

VHardwareIn::VHardwareIn?(int irq ,DWORD flags,DWORD timeout,PVOID refdata)

irg 要虛擬化的IRQ,其值從0~15;

flag 一般設置為0;

timeout 從虛擬中斷申請(assert)到進入VM中的虛擬中斷處理函數(shù)所允許的最大時延,設置0

表示忽略 timeout;

refdata refdata將存放在m_refdata變量中,在通知事件處理函數(shù)里,可以作為參考數(shù)據(jù)。

VHardwareIn::OnHaredwareInt(VMHANDLE hVM)

當IRQ硬件中斷發(fā)生時,VPICD將調(diào)用類VHardwareIn里的成員函數(shù)OnHaredwareInt,在調(diào)用OnHaredwareInt函數(shù)之前,VPICD首先發(fā)Cli指令,同時設置本IRQ的屏蔽位。所以可以在OnHaredwareInt函數(shù)里直接處理中斷服務。

VHardwareIn::hook()

hook成員函數(shù)把虛擬IRQ與OnHaredwareInt函數(shù)相勾連。通過重載OnHaredwareInt函數(shù)用來處理本IRQ的各種中斷事件。返回TRUE表示IRQ虛擬化成功,返回FALSE則表示IRQ虛擬化失敗。

VHardwareIn::physicalUnmask()

命令VPICD物理地不屏蔽本IRQ。

VHardwareIn::sendPhysicalEOI()?

此成員函數(shù)通知VPICD中斷處理結束。VPICD將物理地不屏蔽本IRQ。

在頭文件里派生類VHardwareIn,在派生類中定義構造函數(shù),并重載OnHaredwareInt函數(shù)。

class MyHwInt:public VHardwareIn

{

public: MyHwInt():VHardwareIn(MY_IRQ,0,0,0){}??

/*定義構造函數(shù)*/

virtual VOID OnHardwareInt(VMHANDLE)?

/*重載OnHaredwareInt函數(shù)*/

};??

并在頭文件里定義一個派生類的實例,放在QuickVxD自動生成的AdcardDevice類里:

class AdcardDevice : public VDevice

{

public:

virtual BOOL OnSysDynamicDeviceInit();

/*用來動態(tài)加載VxD*/

virtual BOOL OnSysDynamicDeviceExit();??

/*用來動態(tài)卸載VxD*/

MyHwInt pMyIRQ; /*定義MyHwInt的一個實例*/

};

為了讓VxD能與Ring3級的應用程序通訊,本實例中采用共享內(nèi)存的辦法。在源文件里定義一個內(nèi)存地址,Ring3級應用程序通過讀取此內(nèi)存地址來得到AD卡的采集結果。

源文件以下所示:

#define DEVICE_MAIN

#include "adcard.h"

Declare_Virtual_Device(ADCARD)

#undef DEVICE_MAIN

PWORD pVal=(PWORD)0x9F000?

//定義一個內(nèi)存地址

BOOL AdcardDevice:: OnSysDynamicDeviceInit()

{

pMyIRQ=new MyHwInt();??

/*創(chuàng)建類 MyHwInt的一個實例*/

if(pMyIRQ->hook())? /*判斷本IRQ是否虛擬化成功*/

{?

pMyIRQ->physicalUnmask();? //不屏蔽本IRQ return TRUE

}

else return FALSE;?

}

BOOL AdcardDevice:: OnSysDynamicDeviceExit()

? {

delete ppMyIRQ; //刪除類MyHwInt的實例 retuen TRUE?

? }

VOID MyHwInt::OnHardwareInt(VMHANDLE hVM)

{

...... /*這里寫上處理中斷的代碼*/

? *pVal=_inp(0x0102) /*讀進AD轉換結果,這里假定AD卡存放轉換結果的端口為0x0102*/

sendPhysicalEOI();/*發(fā)中斷結束信號*/

}

用VC++打開此工程文件,編譯后就可得到adcard.vxd文件。

在Ring3級的應有程序中為了調(diào)用adcard.vxd,可在其源文件中添加以下語句:

HANDLE HVXD?

HVXD=CreateFile(″\\\\.\\adcard.vxd″,0,0,0CREATE_NEW,

FILE_FLAG_DELETE_ON_CLOSE,0);?

if(HVXD==INVALID_HANDLE_VALUE)

......

CreateFile()的詳細用法可查閱VC++的幫助。這樣應用程序中就加載了adcard.vxd文件。為了能使此應用程序能得到AD卡的轉換結果,同樣也要在源文件里定義一個內(nèi)存地址:

PWORD pVal=(PWORD)0x9F000;

在需要得到轉換結果的地方加上以下語句即可:

int data;

data=*pVal;//假定把結果存在data變量里

這樣一個中斷實例就完成了。

以上實例我們已在VTOOlsD3.01和VC++6中調(diào)試通過,并已成功地在我們開發(fā)的小型實時光譜能量輻射儀中得到應用。

VxD作為現(xiàn)在流行的編程技術已逐漸受到廣泛的關注,在工程技術中必將有著廣闊的應用前景。學習、使用此技術將在科學研究中給我們帶來便利。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉