0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Windows下硬件中断虚拟设备驱动程序开发工具和编程方法

电子设计 2018-09-20 14:22 次阅读

美国微软公司出品的Windows98以其友好的图形用户界面,在我国赢得了广泛的市场。在给广大办公环境工作人员带来方便的同时,也给不少工程技术人员带来了一些麻烦。一些原本在DOS下很容易编出的控制硬件的程序,现在在Windows98下就不那么容易实现了。作为一个完善的操作系统也必须能控制硬件,象DOS那样直接与硬件打交道是Windows98不提倡的。它需要开发专门的硬件设备驱动程序,即通过一系列的虚拟设备驱动程序来管理硬件,如:进行中断响应、I/O端口读写或直接存储器存取(DMA)。Windows98内核管理机制非常复杂,因而编写虚拟驱动程序也变得十分困难,要想编写虚拟驱动程序,就必须对Windows98的内核有所了解。

1 Windows98的内核管理机制

在Windows95三年后推出的Windows98虽然扩充了许多新的设备驱动特性,如对AGP、USB、DVD的支持,但在内核上却和Windows95基本一样,它们都是基于DOS内核的操作系统。Windows98系统核心(Kernel)由虚拟机管理器(VMM)和VxD(Virtual Device Driver)的集合组成。Kernel提供了900多个服务函数来管理内存、控制物理设备、处理中断、创建网络协议栈、管理文件系统等,这些服务函数都可以被自己写的VxD调用。虚拟机(VM)是一个可运行的任务,包含应用程序、支撑软件、内存和CPU寄存器。在Windows98下有系统虚拟机和DOS虚拟机两种。虚拟机管理器(VMM)是在系统级核心运行的32位保护模式操作系统,它运行于Ring0,而且不可重入。VMM主要功能是创建、运行、监控和终止虚拟机。VxD即虚拟设备驱动程序,是用来扩展Windows操作系统功能的一类程序。由于VxD运行在系统的Ring0级,拥有与操作系统同等的级别,所以我们可利用它来支持硬件设备的管理。虚拟可编程中断控制器(VPICD)是负责管理所有硬件中断事件的程序,它本身也是一种VxD,能提供缺省的中断处理函数或者允许其它VxD重载中断处理函数。

2 Windows98下应用程序权限级别

Intel的80x86CPU系列芯片可在三种模式下工作:实模式、保护模式和V86模式。实模式是MS-DOS的运行环境。Windows98只利用了两种模式:保护模式和V86模式。保护模式给我们带来很多优越性,如应用程序不再受1M内存的限制,理论上,在保护模式下,CPU可以进行4096M内存的寻址。但在保护模式下,所有的应用程序都有权限级别(Privilege Level)。权限级别按优先次序分为四等:0、1、2、3。0级是最高级别,操作系统就运行在0级,运行在Ring0级的应用程序可以执行所有的指令并可直接对硬件、中断和文件系统进行物理访问。如果应用程序拥有的权限级别是第3级,那么它能执行的指令是有限的,对硬件的很多直接操作是不能实现的。在Windows中,一般的应用程序是运行在Ring3级的(如用Visual C++、Borland C++、Visual Basic、Delphi、C++ Builder等SDK工具开发出的应用程序)。它们享有的权限是最低的,受到了保护模式的摫;它们没有权限去绕过操作系统直接对硬件操作。

有了权限级别,操作系统就有机会在中断和I/O操作上产生撔槟铍效果。由于操作系统的权限为0级,它就可以捕获权限不为0级的应用程序的中断和I/O请求,然后建立缓冲队列,再一一进行串行处理。为了使自己的应用程序也能直接处理硬件,就需要编写专门的VxD。由于VxD是作为操作系统的组件运行于第0级,因而可以利用它来捕获特定的硬件操作,完成我们需要的任务。

3 Windows98下虚拟设备驱动程序的开发工具和基本编程方法

微软为驱动程序的开发提供了设备驱动程序工具箱(DDK),基于汇编语言的编程方式和许多VMM服务都使用寄存器的调用方式,确实非常难学,没有深厚的汇编语言和硬件基础很难在短时间里开发出自己的VxD。

程序员可利用C或C++语言编写自己的VxD,而不必操心许多繁琐的细节。它的基本编程方法是:用VToolsD自带的Quick VxD程序快速生成程序框架,在VC++或Borland C++中打开此框架的工程文件,并写进特定的处理代码,编译后就可得到所需的VxD文件。

4 一个中断程序实例

用VToolsD 2.03、VC++5.0为自制的PC/XT总线扩展卡开发了虚拟设备驱动程序Audcard.vxd。该卡每20ms申请一次中断,中断由应用程序动态载入系统的Audcard.vxd响应并加以处理。中断服务程序ISR(InterruptService Routine)结束后,调用函数Shell_PostMessage()向应用程序窗口发送自定义消息。应用程序接受消息后,再通过函数DeviceIoControl()与VxD的接口函数OnW32DeviceIoControl( )互传缓冲区数据。程序结束即可动态卸载VxD。

当中断发生时,处理器转换为ring0级保护模式。Windows系统并不像DOS那样通过中断描述符表IDT(InterruptDescriptorTable)直接指向中断处理过程,而是由IDT入口指向VMM中的程序。该程序将判断是否为中断调用,如果是,则把中断控制权交给虚拟可编程中断控制器VPICD(VirtualProgrammable Interrupt ControllerDevice),VPICD实际上是一个重要的VxD。VPICD再将其交给另一个注册了该中断的VxD(如Audcard.vxd)来处理。VxD程序是通过调用VPICD服务VPICD_Virtualize_IRQ来注册中断的。

虚拟设备驱动程序Audcard.vxd的部分源代码Audcard.h和Audcard.cpp在网上,此应用程序使用了下列函数:CreateFile()动态加载VxD、CloseHandle()并动态卸载VxD、PreTranslateMessage()截获消息、DeviceIoControl()与VxD互传缓冲区数据。虚拟设备驱动程序Audcard.vxd经调试后工作正常,未发生过任何丢失数据或死机的现象。

下面是虚拟设备驱动程序Audcard.vxd的部分源代码Audcard.h和Audcard.cpp,限于篇幅,由QuickVxD自动生成的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号中断

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()

//动态加载时初始化

{

……//硬件初始化

pMyIRQ=new MyHwInt();

if(pMyIRQ&&pMyIRQ->hook()) //挂接中断

{

pMyIRQ->physicalUnmask(); //允许中断

return TRUE;

}

else return FALSE;

}

BOOL

AudcardDevice::OnSysDynamicDeviceExit()

//动态卸载过程

{

delete pMyIRQ;

return TRUE;

}

DWORD

AudcardDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)

//与Win32应用程序的接口函数

{

……

}

VOID

MyHwInt::OnHardwareInt(VMHANDLE hVM)

{

…… // 中断处理

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

//向应用程序窗口发送消息

sendPhysicalEOI(); //通知VPICD中断结束

}

用VToolsD 2.03、VC++ 5.0为自制的PC/XT总线扩展卡开发了虚拟设备驱动程序Audcard.vxd。该卡每20ms申请一次中断,中断由应用程序动态载入系统的Audcard.vxd响应并加以处理。中断服务程序ISR(Interrupt Service Routine)结束后,调用函数Shell_PostMessage( )向应用程序窗口发送自定义消息。应用程序接受消息后,再通过函数DeviceIoControl( )与VxD的接口函数OnW32DeviceIoControl( )互传缓冲区数据。程序结束即可动态卸载VxD。

这样一个中断实例就完成了。

以上实例我们已在VTOOlsD3.01和VC++6中调试通过,并已成功地在我们开发的小型实时光谱能量辐射仪中得到应用。

VxD作为现在流行的编程技术已逐渐受到广泛的关注,在工程技术中必将有着广阔的应用前景。学习、使用此技术将在科学研究中给我们带来便利。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微软
    +关注

    关注

    4

    文章

    6565

    浏览量

    103949
  • 编程
    +关注

    关注

    88

    文章

    3587

    浏览量

    93585
收藏 人收藏

    评论

    相关推荐

    PCI设备WINDOWS驱动程序开发

    PCI设备WINDOWS驱动程序开发摘要:本文主要介绍了在Windows9x操作系统
    发表于 05-03 12:10

    WDM设备驱动程序开发,Windows 2000/XP WD

    Windows 2000/XP WDM设备驱动程序开发主要介绍DriverStudio开发工具开发
    发表于 09-13 22:58 0次下载
    WDM<b class='flag-5'>设备</b><b class='flag-5'>驱动程序</b><b class='flag-5'>开发</b>,<b class='flag-5'>Windows</b> 2000/XP WD

    Windows CE 通用串行总线(USB)驱动程序开发

    Windows CE 通用串行总线(USB)驱动程序开发:通过分析通用串行总线(USB)的拓扑结构和Windows CE
    发表于 05-09 08:07 28次下载

    Windows 2000/XPI/O设备驱动程序的设计

    本文介绍了Windows 2000/XP WDM 驱动程序的基本设计方法;阐述了I/O 设备驱动
    发表于 06-12 13:46 18次下载

    用WinDriver开发PCI设备驱动程序

    用WinDriver开发PCI设备驱动程序:给出了驱动开发工具WinDriver的主要特点,内部机制及
    发表于 06-28 19:26 52次下载

    PCCAN适配卡硬件中断虚拟设备驱动程序的设计

    本文主要介绍了硬件中断和如何在DOS和Windows环境下调试中断服务程序,以及在PCCAN适配卡设计中的
    发表于 09-24 16:40 21次下载

    虚拟设备驱动程序设计开发

     摘  要: 介绍虚拟设备驱动程序开发的基本知识以及VxDs与WIN32应用程序通讯的几种常用方法,并给出了用Vtool
    发表于 11-18 17:25 38次下载

    PCI设备WINDOWS驱动程序开发

    PCI设备WINDOWS驱动程序开发 本文主要介绍了在Windows9x操作系统
    发表于 05-03 11:54 3313次阅读

    PCI设备的WDM驱动程序开发

    本文简要介绍了WDM驱动程序的结构体系,之后结合PCI设备的结构特点,通过实例说明如何利用驱动程序开发工具DriverWorks开发PCI
    发表于 05-19 18:11 0次下载

    Windows WDM设备驱动程序开发指南

    书主要介绍Windows 98和Windows 2000新的驱动程序模型(WDM)。描述了WDM设备驱动程序的结构、功能和
    发表于 12-12 15:31 0次下载
    <b class='flag-5'>Windows</b> WDM<b class='flag-5'>设备</b><b class='flag-5'>驱动程序</b><b class='flag-5'>开发</b>指南

    Windows 2000WDM驱动程序的研究与开发

    本文分析研究了 Windows 2000 WDM 驱动程序的基本原理。以 Microsoft 的 DDK 为开发工具开发了基于 PCI
    发表于 04-18 10:02 0次下载

    Windows CENET中断架构分析和高速AD驱动程序开发

    本文分析了Windows CE.NET嵌入式实时系统的中断架构和流式驱动架构 及其设备驱动程序开发
    发表于 04-18 10:02 0次下载

    Windows CE驱动程序开发

    不同的嵌入式系统硬件平台,往往有其独有或特殊的设备,而这些设备Windows CE驱动程序设计问题是
    发表于 04-18 10:13 0次下载

    Windows CE设备驱动程序开发

    本文介绍了 Windows CE 体系结构和开发 wince 设备驱动程序的过程,阐述了设备驱动程序
    发表于 04-18 10:13 0次下载

    基于Windows CE.NET的设备驱动程序开发

    本文阐述了设备驱动程序的概念和结构 介绍了 Windows CE. NET环境开发驱动程序的特
    发表于 04-18 11:28 0次下载