工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 技术跟踪 > Windows编程 > 正文
虚拟设备驱动程序两关键问题之虚拟化
[文章信息]
作者:陈国友
时间:2004-11-29
出处:中国操作系统支持者
责任编辑:方舟
[文章导读]
应用程序首先动态加载VxD(CreateFile),并用DeviceIoControl将回调函数的地址传给VxD
advertisement
热点推荐
· 禁止QQ登录的方法
· 给你的XML文件做个数字签名
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
· 在VB6中用命令行为模式控制GUI动作
[正文]

1 2  下一页

  在虚拟设备驱动程序(VxD)的设计中,两个尤为关键,且又令人困扰的问题是VxD的虚拟化和VxD与应用程序间的通信机制。下面,对这两个问题作一详细的探讨。

  一、VxD的虚拟化

  由于Windows允许同时运行多个任务,所以出现多个进程试图同时访问同一物理设备的情况时,如果多个应用程序通过同一个DLL驱动程序(注意和虚拟设备驱动程序VxD的区别)访问设备,不需要对该设备虚拟化,驱动程序使之顺序访问;如果是多个Windows应用程序对相同设备同时访问,由于都运行于System VM(系统虚拟机),所以也不需要虚拟化,它们的访问将由一个驱动程序(Windows driver DLL)进行检测并使之串行化,而不是依靠VxD;如果多个VM试图访问同一设备,由于DOS应用程序能够直接操纵硬件,所以必须对该设备进行虚拟化,一个虚拟化设备的VxD负责可靠地检测多个VM试图访问同一设备的情况,并采取仲裁的策略来解决这种冲突。这里可能有以下几种解决方案:

  1、允许一个VM访问物理设备,同时忽略其它的VM。这是最简单的虚拟化形式。如VPD(Virtual Printer Device)。

  2、允许一个VM访问物理设备,同时为其它的VM虚拟化设备。如VKD(Virtual Keyboard Device)分配给一个VM,并使之获得物理键盘的访问权(包括键盘中断在内),对其它的VM而言,VKD只向它们提供一个空的键盘缓冲区。

  3、允许多个VM共享同一物理设备。尽管存在假象,但从VM的观点来看,这种方法与独享访问一样。如VDD(Virtual Display Device),使每一个Windows环境下的DOS VM认为是直接写入显存,其实只是被VDD映射到了一个窗口的缓冲区。

  4、VxD独立访问物理设备的同时,允许一个VM访问虚拟设备,这是最复杂的虚拟化形式。如VCD(Virtual Com Device),VCD缓冲区接收串行数据并通过映射中断透明地传给相应的一个VM,VM在中断处理过程中读取串口数据寄存器,这些数据的实质是VCD缓冲区已经接收的数据。

  与物理设备一样,硬件中断很多时候也必须虚拟化,这种情况更为复杂。虚拟化中断实质上就是将硬件产生的中断映射到需要它的每一个VM(不管该VM是否正在运行),替代VxD进行服务。在这里我们给出一个虚拟化中断的VxD实例的几个重要回调过程,并采用最简单的仲裁策略来解决访问冲突(见程序1)。

  typedef struct
  {
 IRQHANDLE IrqHandle;
  VMHANDLE VMOwner;
  Char DeviceName[8];
  BOOL bVMIsServicing;
  } DEVICE_CONTEXT;

  void _stdcall MaskChangHandler ( VMHANDLE hVM , IRQHANDLE hIRQ , BOOL bMasking )

  //当一个VM在中断控制器中屏蔽或打开中断hIRQ时,VPICD调用该过程

  {
  if ( !bMasking ) //若为打开中断
  {
  if ( !device.VMOwner )
  {
  device.VMOwner = hVM; //若无任何VM占有该中断,则将该中断的拥有权设为当前VM
  }
  else
  {
  if ( device.VMOwner != hVM )
  {
  device.VMOwner = SHELL_Resolve_Contention ( device.VMOwner , hVM , device.DeviceName );

  //若已有VM占有该中断,则用户可通过对话框在两者间作出选择

  }
  }
  VPICD_Physically_Unmask ( hIRQ ); //打开该物理中断
  }
  else
  {
  device.VMOwner = 0;
  VPICD_Physically_Mask ( hIRQ ); //屏蔽该物理中断
  }
  }

  BOOL _stdcall HwIntHandler ( VMHANDLE hVM , IRQHANDLE hIRQ )

  //当中断hIRQ发生,VPICD立即调用该过程

  {
  if ( device.VMOwner && !device.bVMIsServicing ) //若有VM占有该中断并且不在上一次的中断处理中
  {
  VPICD_Set_Int_Request ( device.VMOwner , hIRQ ); //请见本例程后的讨论
  }
  else
  {
  ......
  }
  return TRUE;
  }

  void _stdcall VirtIntHandler ( VMHANDLE hVM , IRQHANDLE hIRQ )

  //当VPICD每次向VM模拟中断时,调用该过程

  {

  device.bVMIsServicing = TRUE; //设置中断处理标志

  }

  void _stdcall IRETHandler ( VMHANDLE hVM , IRQHANDLE hIRQ )

  //当从VM的中断处理返回,执行该回调

  {
  device.bVMIsServicing = FALSE; //清除中断处理标志
   }
  (程序1)

  由于中断是异步产生的,所以当VxD调用VPICD(虚拟可编程中断控制器)服务VPICD_Set_Int_Request将该中断映射到VM时,该VM应处于执行状态。

  (1)在映射的第一步,VPICD通过调用VMM(虚拟机管理器)服务Call_Priority_VM_Event强制调度所希望的VM,使用最高的优先权(Time_Critical_Boost);

  (2)VPICD提供一个该服务的回调,所以当VM被调度运行时,VMM即可通知VPICD;

  (3)然后VPICD通过调用另一个VMM服务Simulate_Int来调整VM的运行环境。该服务将VM的CS、IP和标志寄存器压入VM的堆栈,从VM的中断向量表IVT取出新的CS、IP和标志寄存器,并且清除中断标志;

  (4)当VPICD从回调返回,并且VMM变回V86模式时,VM便立即执行已向VPICD注册的中断处理过程。

  编写虚拟化设备的VxD与编写非虚拟化设备的VxD有很大的不同,主要是它要用到一组完全不同的VMM和VxD服务。实际上,现在很多为新设备所编写的VxD根本就不再虚拟化,因为并没有DOS或Windows应用程序直接访问这些硬件。

1 2  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 打开”金笼子”——VXD技术漫谈
  • 民营家电商排队造手机 设备商全面杀入
  • 英特尔澄清杨旭任职传闻 官方没宣布此消息
  • 国资委河北密制联通拆分方案
  • 垃圾邮件害人害企害国 清除垃圾邮件不手软
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • 外电称中兴正评估西门子手机业务 或能并购
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索