·天新网首页·加入收藏·设为首页
首页|笔记本|手机|数码相机|摄像机|MP3/MP4|主板|内存|显示器|办公|打印机|下载|开发|汽车|学院|业界
硬件|台式机|数码|数字家庭|投影仪|GPS/CPU|显卡|硬盘|服务器|网络|一体机|驱动|源码|游戏|考试|报价
虚拟设备驱动程序两关键问题之虚拟化
http://dev.21tx.com 2004年11月29日 中国操作系统支持者 陈国友

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应用程序直接访问这些硬件。

上一篇: Win32位程序设计初步之系统安全
下一篇: Win32位程序设计初步之网络通信

1 2 下一页

Google
 
热点文章
关于我们 | 联系我们 | 广告服务 | 工作机会 | 版权声明 | 欢迎投稿 | 网站地图
Copyright © 2000-2008 , www.21tx.com , All Rights Reserved .
晨新科技 版权所有 Created by TXSite.net