大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 虚拟设备驱动程序的设计与实现

虚拟设备驱动程序的设计与实现

时间: 2021-07-31 作者:daque

陈国友   因为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级上的。图1不妨使你更好地领会windows的假造情况。   图   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等调节和测试情况下才将其载入。   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是不简单的。   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。下图表白在win 95下vxd对硬件阻碍的处置进程。   图win95下硬件阻碍的处置进程   当阻碍爆发时,处置器变换为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未列出。   ①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阻碍中断   }   (作家地方:南京通讯工程学院98邮箱 210016 收稿日子:1998.12.03)

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.