当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]摘 要: 介绍了Windows98的内核管理机制和应用程序权限级别,简述了在Windows98下进行虚拟驱动程序开发的几种工具和编程方法,并给出了借助VToolsD用C++语言编写的处理硬件

摘 要: 介绍了Windows98的内核管理机制和应用程序权限级别,简述了在Windows98下进行虚拟驱动程序开发的几种工具和编程方法,并给出了借助VToolsD用C++语言编写的处理硬件中断的程序实例。

关键词: 虚拟设备驱动程序 VToolsD 中断服务例程

美国微软公司出品的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。

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

4 一个中断程序实例

用C或C++都可在VToolsD中进行开发,相比之下,由于VToolsD中封装许多C++类库,因而用C++语言进行VxD的开发更加容易和方便。

在我们开发的小型实时光谱能量辐射仪中利用北京众人公司的PS-2129AD采集卡作为数据采集器件。卡上载有三路8253计数器,利用其中的两路产生光电二极管阵列(SSPD)的驱动信号,另外一路让它工作在方式0椉剖?崾???卸希?康奔剖?当湮?埃?悴??卸希?谥卸铣绦蚶锝?惺?莶杉?1纠?兄卸虾盼?埂?/P>

定义好设备属性各参数后,在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来实现对某个IRQ端口的虚拟化,并处理该IRQ端口上的硬件中断。本实例中就用到这个类。

类OnHaredwareInt的主要成员函数定义如下:

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

irg 要虚拟化的IRQ,其值从0~15;

flag 一般设置为0;

timeout 从虚拟中断申请(assert)到进入VM中的虚拟中断处理函数所允许的最大时延,设置0

表示忽略 timeout;

refdata refdata将存放在m_refdata变量中,在通知事件处理函数里,可以作为参考数据。

VHardwareIn::OnHaredwareInt(VMHANDLE hVM)

当IRQ硬件中断发生时,VPICD将调用类VHardwareIn里的成员函数OnHaredwareInt,在调用OnHaredwareInt函数之前,VPICD首先发Cli指令,同时设置本IRQ的屏蔽位。所以可以在OnHaredwareInt函数里直接处理中断服务。

VHardwareIn::hook()

hook成员函数把虚拟IRQ与OnHaredwareInt函数相勾连。通过重载OnHaredwareInt函数用来处理本IRQ的各种中断事件。返回TRUE表示IRQ虚拟化成功,返回FALSE则表示IRQ虚拟化失败。

VHardwareIn::physicalUnmask()

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

VHardwareIn::sendPhysicalEOI()?

此成员函数通知VPICD中断处理结束。VPICD将物理地不屏蔽本IRQ。

在头文件里派生类VHardwareIn,在派生类中定义构造函数,并重载OnHaredwareInt函数。

class MyHwInt:public VHardwareIn

{

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

/*定义构造函数*/

virtual VOID OnHardwareInt(VMHANDLE)?

/*重载OnHaredwareInt函数*/

};??

并在头文件里定义一个派生类的实例,放在QuickVxD自动生成的AdcardDevice类里:

class AdcardDevice : public VDevice

{

public:

virtual BOOL OnSysDynamicDeviceInit();

/*用来动态加载VxD*/

virtual BOOL OnSysDynamicDeviceExit();??

/*用来动态卸载VxD*/

MyHwInt pMyIRQ; /*定义MyHwInt的一个实例*/

};

为了让VxD能与Ring3级的应用程序通讯,本实例中采用共享内存的办法。在源文件里定义一个内存地址,Ring3级应用程序通过读取此内存地址来得到AD卡的采集结果。

源文件以下所示:

#define DEVICE_MAIN

#include "adcard.h"

Declare_Virtual_Device(ADCARD)

#undef DEVICE_MAIN

PWORD pVal=(PWORD)0x9F000?

//定义一个内存地址

BOOL AdcardDevice:: OnSysDynamicDeviceInit()

{

pMyIRQ=new MyHwInt();??

/*创建类 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();/*发中断结束信号*/

}

用VC++打开此工程文件,编译后就可得到adcard.vxd文件。

在Ring3级的应有程序中为了调用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卡的转换结果,同样也要在源文件里定义一个内存地址:

PWORD pVal=(PWORD)0x9F000;

在需要得到转换结果的地方加上以下语句即可:

int data;

data=*pVal;//假定把结果存在data变量里

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

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

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭