当前位置:天才代写 > tutorial > C语言/C++ 教程 > 虚拟设备驱动措施的设计与实现

虚拟设备驱动措施的设计与实现

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:416

副标题#e#

由于Windows对系统底层操纵采纳了屏蔽的计策,因而对用户而言,系统变得更为安详,但这却给浩瀚的硬件可能系统软件开拓人员带来了不小的坚苦,因为只要应用中涉及到底层的操纵,开拓人员就不得不深入到Windows的内核去编写属于系统级的虚拟设备驱动措施。Win 98与Win 95设备驱动措施的机理不尽沟通,Win 98不只支持与Windows NT 5.0兼容的WDM(Win32 Driver Mode)模式驱动措施,并且还支持与Win 95兼容的虚拟设备驱动措施VxD(Virtual Device Driver)。下面先容了基于Windows 9x平台的虚拟情况、虚拟设备驱动措施VxD的根基道理和设计要领,并团结开拓东西VToolsD给出了一个为可视电话音频卡配套的虚拟设备驱动措施VxD的设计实例。

1.Windows 9x的虚拟情况

Windows 9x作为一个完整的32位多任务操纵系统,它不像Window 3.x那样依赖于MS-DOS,但为了担保软件的兼容性,Windows 9x除了支持Win16应用措施和Win32应用措施之外,还得支持MS-DOS应用措施的运行。Windows 9x是通过虚拟机VM(Virtual Machine)情况来确保其兼容和多任务特性的。

所谓Windows虚拟机(凡是简称为Windows VM)就是指执行应用措施的虚拟情况,它包罗MS-DOS VM和System VM两种虚拟机情况。在每一个MS-DOS VM中都只运行一个MS-DOS历程,而System VM能为所有的Windows应用措施和动态链接库DLL(Dynamic Link Libraries)提供运行情况。每个虚拟机都有独立的地点空间、寄存器状态、仓库、局部描写符表、间断表状态和执行优先权。固然Win16、Win32应用措施都运行在System VM情况下,但Win16应用措施共享同一地点空间,而Win32应用措施却有本身独立的地点空间。

在编写应用措施时,编程人员常常忽略虚拟情况和实情况之间的差别,一般认为虚拟情况也就是实情况。可是,在编写虚拟设备驱动措施VxD时却不能这样做,因为VxD的事情是向应用措施代码提供一个与硬件接口的情况,为每一个客户虚拟机打点虚设备的状态,透明地仲裁多个应用措施,同时对底层硬件举办会见。这就是所谓虚拟化的观念。

VxD在虚拟机打点器VMM(Virtual Machine Manager)的监控下运行,而VMM实际上是一个非凡的VxD。VMM执行与系统资源有关的事情,提供虚拟机情况(能发生、调治、卸载VM)、认真调治多线程占先时间片及打点虚拟内存等事情。VxD与VMM运行在其他任何虚拟机之外,VxD事实上就是实现虚拟机的软件的一部门。

与大大都操纵系统一样,Windows也是回收条理式体系布局。VMM和VxDs组成了Win 95的ring0级的系统焦点(应用措施运行在ring3级,ring1、ring2级未被利用),具有系统的最高优先权。Windows还提供一些以"drv"为后缀名的驱动措施,主要是指串行口的通信措施和并行口的打印机措施。这些措施与VxD差异,它们是运行在ring3级上的。

2.深入领略VMM和VxD

如前所述,VxD是Virtual Device Driver的缩写,但有人将它领略为虚拟任何驱动措施。实际上,VxD并非仅指那些虚拟化的某一详细硬件的设备驱动措施。好比某些VxD可以或许虚拟化设备,而某些VxD作为设备驱动措施却并不虚拟化设备,尚有些VxD与设备并没有什么干系,它仅向其他的VxD或是应用措施提供处事。

VxD可以随VMM一起静态加载,也可以按照需要动态加载或卸载。正是由于VxD与VMM之间的细密协作,才使得VxD具有了应用措施所不具备的本领,诸如可以不受限制地会见硬件设备、任意查察操纵系统数据布局(如描写符表、页表等)、会见任何内存区域、捕捉软件间断、捕捉I/O端口操纵和内存会见等,甚至还可以截取硬件间断。

尽量VxD利用32位平面存储模式(flat memory model),但它的代码和数据仍利用分段打点,段有六种范例,即实模式初始化、掩护模式初始化、可分页、不行分页、静态和只调试(debug only),每种范例又有代码段和数据段之分,所以VxD共有12个段。实模式代码段和数据段为16位(分段模式),其他段则是32位(平面模式)。“实模式初始化”段包括了在Windows初始化进程的最初阶段VMM变为掩护模式之前要执行的代码。静态加载的VxD此时可以查察Windows启动前的实模式情况,抉择是否继承加载,并通知VMM。加载完毕后,VMM进入掩护模式并执行掩护模式初始化代码,同样将执行功效再通知VMM。初始化完成后,“实模式初始化”段和“掩护模式初始化”段即被遗弃。VxD的大部门代码都在其他的某一段中,“可分页”段答允虚拟存储打点器(Virtual Memory Manager)举办分页打点,大大都的VxD代码都该当在“可分页”段。“不行分页”段的内容主要包罗:VxD的主进口点、硬件间断处理惩罚函数、所会见的数据以及能被另一个VxD间断处理惩罚函数挪用的异步处事。“静态”段仅用于可以动态加载的VxD,当VxD卸载后,静态代码段和数据段都保存在内存中。“只调试”段只是VMM在Soft-ICE for Win 95等调试情况下才将其载入。

#p#分页标题#e#

VMM是通过VxD的设备描写符块DDB(Device Descriptor Block)来识此外。DDB向VMM提供了VxD的主进口点,还向应用措施和其他的VxD提供了进口点。VMM操作这个主进口点将VM及Windows自身的状态通知给VxD,然后VxD通过相应的事情来响应这些事件。由于VxD不只仅处事于一个物理设备(好比多个串口)或仅与一个VM产生接洽,所以VxD需要发生本身支持的数据布局(Supporting Data Structures)来生存每一个设备、每一个VM的设置和状态信息。VxD用一个或多个设备上下文布局来生存设备信息,如I/O端口基地点、间断向量等,VxD将本身的每个VM的状态信息生存在VMM的VM节制块中。

VMM提供的处事包罗:事件处事、内存打点处事、兼容执行和掩护模式执行的处事、登录表处事、调治措施处事、同步处事、调试处事、I/O捕捉处事、处理惩罚错误和间断处事、VM间断和回调处事、设置打点措施处事以及其他杂项处事。

以上内容仅涉及到VxD设计的一小部门,作为VxD的开拓人员必需把握更多的常识。首先是操纵系统的常识,如地点空间、执行上下文、资源加锁、历程间通信和异步事件处理惩罚等方面的常识;其次,对Intel处理惩罚器应有较深入的领略,包罗寄存器、呆板指令集、掩护机制、分页机制,以及虚拟8086模式;最后,还必需熟悉VMM提供的种种处事和接口,熟悉Windows其他的系统VxD。

3.开拓东西VToolsD简介

VToolsD是专门用于开拓VxD措施的一种东西软件,它包罗VxD框架代码生成器QuickVxD、C运行库、VMM/VxD处事库、VxD的C++类库、VxDLoad和VxDView等实用东西以及大量的C、C++例程。由VC++、BC++的32位编译器编译生成的VxD措施可以离开VToolsD情况运行。

操作QuickVxD可以利便、快捷地生成VxD的框架,即生成后缀名为h、cpp和mak的三个文件。源文件包括了运行VxD的根基组件,个中包括节制动静处理惩罚、API进口点、以及VxD处事等函数框架,而且还界说了符号,配置了编译参数,声明白类,然后在C++情况下,向生成的各个处理惩罚函数体内添加本身的代码,最后利用编译器NMAKE生成尺度的VxD措施。

由于VxD运行在ring0级,所以调试措施相当坚苦。我利用的调试东西是Soft-ICE for Win 95。

今朝VToolsD的最新版本为3.0,它支持设备会见体系布局DAA(Device Access Architecture),所编写的措施代码将可以在所有Windows平台(包罗Win 95、Win 98以及Windows NT)上共享。虽然也可以利用Microsoft公司的DDK(Device Developer Kit)来开拓VxD,但DDK不能像VToolsD那样通过屏蔽系统及VxD的底层技能细节提供富厚的C运行库和C++类库,而是让开拓人员充实享用面向工具编程要领的利便与快捷,因此仅就该点而言,利用DDK是不利便的。


#p#副标题#e#

4.VxD措施设计实例

我在开拓可视电话音频卡的设计进程中,用VToolsD 2.03、VC++ 5.0为廉价的PC/XT总线扩展卡开拓了虚拟设备驱动措施Audcard.vxd。该卡每20ms申请一次间断,间断由应用措施动态载入系统的Audcard.vxd响应并加以处理惩罚。间断处事措施ISR(Interrupt Service Routine)竣事后,挪用函数Shell_PostMessage( )向应用措施窗口发送自界说动静。应用措施接管动静后,再通过函数DeviceIoControl( )与VxD的接口函数OnW32DeviceIoControl( )互传缓冲区数据。措施竣事即可动态卸载VxD。

傍边断产生时,处理惩罚器转换为ring0级掩护模式。Windows系统并不像DOS那样通过间断描写符表IDT(Interrupt Descriptor Table)直接指向间断处理惩罚进程,而是由IDT进口指向VMM中的措施。该措施将判定是否为间断挪用,假如是,则把间断节制权交给虚拟可编程间断节制器VPICD(Virtual Programmable Interrupt Controller Device),VPICD实际上是一个重要的VxD。VPICD再将其交给另一个注册了该间断的VxD(如Audcard.vxd)来处理惩罚。VxD措施是通过挪用VPICD处事VPICD_Virtualize_IRQ来注册间断的。

虚拟设备驱动措施Audcard.vxd的部门源代码Audcard.h和Audcard.cpp在网上,网址为:www.pccomputing.com.cn。此应用措施利用了下列函数:CreateFile()动态加载VxD、CloseHandle()并动态卸载VxD、PreTranslateMessage()截获动静、DeviceIoControl()与VxD互传缓冲区数据。虚拟设备驱动措施Audcard.vxd经调试后事情正常,未产生过任何丢失数据或死机的现象。

下面是虚拟设备驱动措施Audcard.vxd的部门源代码Audcard.h和Audcard.cpp,限于篇幅,由QuickVxD自动生成的Audcard.mak未列出。

#p#分页标题#e#

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间断竣事
}

 

    关键字:

天才代写-代写联系方式