0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Windows下硬件中斷虛擬設(shè)備驅(qū)動(dòng)程序開發(fā)工具和編程方法

電子設(shè)計(jì) ? 2018-09-20 14:22 ? 次閱讀

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

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

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

2 Windows98下應(yīng)用程序權(quán)限級(jí)別

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

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

3 Windows98下虛擬設(shè)備驅(qū)動(dòng)程序的開發(fā)工具和基本編程方法

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

程序員可利用C或C++語言編寫自己的VxD,而不必操心許多繁瑣的細(xì)節(jié)。它的基本編程方法是:用VToolsD自帶的Quick VxD程序快速生成程序框架,在VC++或Borland C++中打開此框架的工程文件,并寫進(jìn)特定的處理代碼,編譯后就可得到所需的VxD文件。

4 一個(gè)中斷程序?qū)嵗?/strong>

用VToolsD 2.03、VC++5.0為自制的PC/XT總線擴(kuò)展卡開發(fā)了虛擬設(shè)備驅(qū)動(dòng)程序Audcard.vxd。該卡每20ms申請一次中斷,中斷由應(yīng)用程序動(dòng)態(tài)載入系統(tǒng)的Audcard.vxd響應(yīng)并加以處理。中斷服務(wù)程序ISR(InterruptService Routine)結(jié)束后,調(diào)用函數(shù)Shell_PostMessage()向應(yīng)用程序窗口發(fā)送自定義消息。應(yīng)用程序接受消息后,再通過函數(shù)DeviceIoControl()與VxD的接口函數(shù)OnW32DeviceIoControl( )互傳緩沖區(qū)數(shù)據(jù)。程序結(jié)束即可動(dòng)態(tài)卸載VxD。

當(dāng)中斷發(fā)生時(shí),處理器轉(zhuǎn)換為ring0級(jí)保護(hù)模式。Windows系統(tǒng)并不像DOS那樣通過中斷描述符表IDT(InterruptDescriptorTable)直接指向中斷處理過程,而是由IDT入口指向VMM中的程序。該程序?qū)⑴袛嗍欠駷橹袛嗾{(diào)用,如果是,則把中斷控制權(quán)交給虛擬可編程中斷控制器VPICD(VirtualProgrammable Interrupt ControllerDevice),VPICD實(shí)際上是一個(gè)重要的VxD。VPICD再將其交給另一個(gè)注冊了該中斷的VxD(如Audcard.vxd)來處理。VxD程序是通過調(diào)用VPICD服務(wù)VPICD_Virtualize_IRQ來注冊中斷的。

虛擬設(shè)備驅(qū)動(dòng)程序Audcard.vxd的部分源代碼Audcard.h和Audcard.cpp在網(wǎng)上,此應(yīng)用程序使用了下列函數(shù):CreateFile()動(dòng)態(tài)加載VxD、CloseHandle()并動(dòng)態(tài)卸載VxD、PreTranslateMessage()截獲消息、DeviceIoControl()與VxD互傳緩沖區(qū)數(shù)據(jù)。虛擬設(shè)備驅(qū)動(dòng)程序Audcard.vxd經(jīng)調(diào)試后工作正常,未發(fā)生過任何丟失數(shù)據(jù)或死機(jī)的現(xiàn)象。

下面是虛擬設(shè)備驅(qū)動(dòng)程序Audcard.vxd的部分源代碼Audcard.h和Audcard.cpp,限于篇幅,由QuickVxD自動(dòng)生成的Audcard.mak未列出。

①Audcard.h

//AUDCARD.h - include file for VxD AUDCARD

#include

#define DEVICE_CLASS AudcardDevice

#define

AUDCARD_DeviceID UNDEFINED_DEVICE_ID

#define AUDCARD_Init_Order

UNDEFINED_INIT_ORDER#define AUDCARD_Major

#define AUDCARD_Minor 0

#define MY_IRQ 5 //定義5號(hào)中斷

class MyHwInt:public VHardwareInt

{

public:

MyHwInt():VHardwareInt(MY_IRQ,0,0,0){}

virtual VOID OnHardwareInt(VMHANDLE);

};

class AudcardDevice :

public VDevice

{

public:

virtual BOOL

OnSysDynamicDeviceInit();

virtual BOOL OnSysDynamicDeviceExit();

virtual DWORD OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams);

MyHwInt* pMyIRQ;

};

class AudcardVM : public

VVirtualMachine

{

public:

AudcardVM(VMHANDLE hVM);

};

class AudcardThread : public VThread

{

public:

AudcardThread(THREADHANDLE hThread);

};

②Audcard.cpp

//AUDCARD.cpp - main module for VxD AUDCARD

#define DEVICE_MAIN

#include "audcard.h"

Declare_Virtual_Device(AUDCARD)

#define WM_USER_POSTVXD

0x1000

//自定義消息

#undef DEVICE_MAIN

AudcardVM::AudcardVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}

AudcardThread::AudcardThread(THREADHANDLE hThread) :

VThread(hThread) {}

BOOL AudcardDevice::OnSysDynamicDeviceInit()

//動(dòng)態(tài)加載時(shí)初始化

{

……//硬件初始化

pMyIRQ=new MyHwInt();

if(pMyIRQ&&pMyIRQ->hook()) //掛接中斷

{

pMyIRQ->physicalUnmask(); //允許中斷

return TRUE;

}

else return FALSE;

}

BOOL

AudcardDevice::OnSysDynamicDeviceExit()

//動(dòng)態(tài)卸載過程

{

delete pMyIRQ;

return TRUE;

}

DWORD

AudcardDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)

//與Win32應(yīng)用程序的接口函數(shù)

{

……

}

VOID

MyHwInt::OnHardwareInt(VMHANDLE hVM)

{

…… // 中斷處理

SHELL_PostMessage(AppWnd,WM_USER_POSTVXD ,0,0,0,NULL);

//向應(yīng)用程序窗口發(fā)送消息

sendPhysicalEOI(); //通知VPICD中斷結(jié)束

}

用VToolsD 2.03、VC++ 5.0為自制的PC/XT總線擴(kuò)展卡開發(fā)了虛擬設(shè)備驅(qū)動(dòng)程序Audcard.vxd。該卡每20ms申請一次中斷,中斷由應(yīng)用程序動(dòng)態(tài)載入系統(tǒng)的Audcard.vxd響應(yīng)并加以處理。中斷服務(wù)程序ISR(Interrupt Service Routine)結(jié)束后,調(diào)用函數(shù)Shell_PostMessage( )向應(yīng)用程序窗口發(fā)送自定義消息。應(yīng)用程序接受消息后,再通過函數(shù)DeviceIoControl( )與VxD的接口函數(shù)OnW32DeviceIoControl( )互傳緩沖區(qū)數(shù)據(jù)。程序結(jié)束即可動(dòng)態(tài)卸載VxD。

這樣一個(gè)中斷實(shí)例就完成了。

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

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


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 微軟
    +關(guān)注

    關(guān)注

    4

    文章

    6554

    瀏覽量

    103903
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3574

    瀏覽量

    93545
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PCI設(shè)備WINDOWS驅(qū)動(dòng)程序開發(fā)

    PCI設(shè)備WINDOWS驅(qū)動(dòng)程序開發(fā)摘要:本文主要介紹了在Windows9x操作系統(tǒng)
    發(fā)表于 05-03 12:10

    WDM設(shè)備驅(qū)動(dòng)程序開發(fā),Windows 2000/XP WD

    Windows 2000/XP WDM設(shè)備驅(qū)動(dòng)程序開發(fā)主要介紹DriverStudio開發(fā)工具開發(fā)
    發(fā)表于 09-13 22:58 ?0次下載
    WDM<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)程序</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>Windows</b> 2000/XP WD

    Windows CE 通用串行總線(USB)驅(qū)動(dòng)程序開發(fā)

    Windows CE 通用串行總線(USB)驅(qū)動(dòng)程序開發(fā):通過分析通用串行總線(USB)的拓?fù)浣Y(jié)構(gòu)和Windows CE
    發(fā)表于 05-09 08:07 ?28次下載

    Windows 2000/XPI/O設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)

    本文介紹了Windows 2000/XP WDM 驅(qū)動(dòng)程序的基本設(shè)計(jì)方法;闡述了I/O 設(shè)備驅(qū)動(dòng)
    發(fā)表于 06-12 13:46 ?18次下載

    用WinDriver開發(fā)PCI設(shè)備驅(qū)動(dòng)程序

    用WinDriver開發(fā)PCI設(shè)備驅(qū)動(dòng)程序:給出了驅(qū)動(dòng)開發(fā)工具WinDriver的主要特點(diǎn),內(nèi)部機(jī)制及
    發(fā)表于 06-28 19:26 ?52次下載

    PCCAN適配卡硬件中斷虛擬設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)

    本文主要介紹了硬件中斷和如何在DOS和Windows環(huán)境下調(diào)試中斷服務(wù)程序,以及在PCCAN適配卡設(shè)計(jì)中的
    發(fā)表于 09-24 16:40 ?21次下載

    虛擬設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)開發(fā)

     摘  要: 介紹虛擬設(shè)備驅(qū)動(dòng)程序開發(fā)的基本知識(shí)以及VxDs與WIN32應(yīng)用程序通訊的幾種常用方法,并給出了用Vtool
    發(fā)表于 11-18 17:25 ?38次下載

    PCI設(shè)備WINDOWS驅(qū)動(dòng)程序開發(fā)

    PCI設(shè)備WINDOWS驅(qū)動(dòng)程序開發(fā) 本文主要介紹了在Windows9x操作系統(tǒng)
    發(fā)表于 05-03 11:54 ?3307次閱讀

    PCI設(shè)備的WDM驅(qū)動(dòng)程序開發(fā)

    本文簡要介紹了WDM驅(qū)動(dòng)程序的結(jié)構(gòu)體系,之后結(jié)合PCI設(shè)備的結(jié)構(gòu)特點(diǎn),通過實(shí)例說明如何利用驅(qū)動(dòng)程序開發(fā)工具DriverWorks開發(fā)PCI
    發(fā)表于 05-19 18:11 ?0次下載

    Windows WDM設(shè)備驅(qū)動(dòng)程序開發(fā)指南

    書主要介紹Windows 98和Windows 2000新的驅(qū)動(dòng)程序模型(WDM)。描述了WDM設(shè)備驅(qū)動(dòng)程序的結(jié)構(gòu)、功能和
    發(fā)表于 12-12 15:31 ?0次下載
    <b class='flag-5'>Windows</b> WDM<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)程序</b><b class='flag-5'>開發(fā)</b>指南

    Windows 2000WDM驅(qū)動(dòng)程序的研究與開發(fā)

    本文分析研究了 Windows 2000 WDM 驅(qū)動(dòng)程序的基本原理。以 Microsoft 的 DDK 為開發(fā)工具,開發(fā)了基于 PCI
    發(fā)表于 04-18 10:02 ?0次下載

    Windows CENET中斷架構(gòu)分析和高速AD驅(qū)動(dòng)程序開發(fā)

    本文分析了Windows CE.NET嵌入式實(shí)時(shí)系統(tǒng)的中斷架構(gòu)和流式驅(qū)動(dòng)架構(gòu) 及其設(shè)備驅(qū)動(dòng)程序開發(fā)
    發(fā)表于 04-18 10:02 ?0次下載

    Windows CE驅(qū)動(dòng)程序開發(fā)

    不同的嵌入式系統(tǒng)硬件平臺(tái),往往有其獨(dú)有或特殊的設(shè)備,而這些設(shè)備Windows CE驅(qū)動(dòng)程序設(shè)計(jì)問題是
    發(fā)表于 04-18 10:13 ?0次下載

    Windows CE設(shè)備驅(qū)動(dòng)程序開發(fā)

    本文介紹了 Windows CE 體系結(jié)構(gòu)和開發(fā) wince 設(shè)備驅(qū)動(dòng)程序的過程,闡述了設(shè)備驅(qū)動(dòng)程序
    發(fā)表于 04-18 10:13 ?0次下載

    基于Windows CE.NET的設(shè)備驅(qū)動(dòng)程序開發(fā)

    本文闡述了設(shè)備驅(qū)動(dòng)程序的概念和結(jié)構(gòu) 介紹了 Windows CE. NET環(huán)境開發(fā)驅(qū)動(dòng)程序的特
    發(fā)表于 04-18 11:28 ?0次下載