首页 > 学院 > 开发设计 > 正文

罗云彬VxD教程--虚拟设备驱动程序初步

2019-11-17 05:34:09
字体:
来源:转载
供稿:网友
在本教程里,我假定读者对诸如虚8086模式,调页,GDT,LDT,IDT之类的INTEL 80x86保护模式的操作比较熟悉。假如你不了解这些,那你要先在 http://developer.intel.com/design/pentium/manuals/阅读INTEL的文档。

内容:

Windows95是一个运行在最高级特权,第0层级别的多线程操作系统。所有的应用程序都运行在最低级特权,第3层级别上。这样就限制了应用程序对系统的操作。它们不能使用cpu特权指令,不能直接访问I/O端口,等等。你对gdi32,kernal32和user32这三个大的系统组件一定很熟悉。你肯定会认为这样重要的代码段一定是在第0层级别下运行的。但是实际上,它们和其他的应用程序一样,是在第三层级别下运行的。这就是说它们并不比Windows计算器,或者扫雷游戏有更多的权限。系统的控制实权把握在虚拟级治理器(VMM) 和虚拟设备驱动程序(VxD)手中。
这一切都是由dos引起的。在Window 3.x的时代,在市场上有很多成功的dos软件。Windows 3.x必须同时运行普通的Windows程序和dos程序,否则,它就会失去市场。
这个局面是很难处理的,因为dos程序和Windows程序有本质的不同。dos程序认为它们拥有系统的一切:键盘,cpu,内存,硬盘等等。dos程序不知道怎样和其他程序合作,而Windows程序(从那时候起)是可靠的多任务合作系统。也就是每个Windows程序都必须通过GetMessage或PeekMessage来和其他程序进行交流。
解决办法就是,在一个8086虚拟机上运行所有的dos程序,而在另一个叫做系统虚拟机的虚拟机上运行其他所有的Windows程序。Windows负责把cpu运算时间轮流的分给每个虚拟机。这样,在Windows 3.x里。Windows程序之间用的是合作多任务,而虚拟机之间用的是优先级多任务。
什么是一个虚拟机?一个虚拟机是被软件创建的一个假象。一个虚拟机和在它上面运行的程序交互,就像这个程序是在真正的机器上运行一样。这样,一个程序不知道也不关心自己是否是在虚拟机上运行。只要虚拟机准确的像一个真的机器一样响应程序,我们就可以把它当成一个真正的机器。
你可以把虚拟机这种实机器和软件之间的接口看作一种API。这种不平常的API由中断,BIOS调用和I/O端口组成。假如Windows能够以某种方法完美的模拟这个API,那么在虚拟机上运行的程序就会表现的和它们在实际器上运行时完全一样。
这就是为什么会出现VMM和VxD的原因。为了协调和监视虚拟机(VMs),Windows需要一个程序来分配任务。这个程序就是虚拟机治理器(VMM)。

虚拟机治理器

VMM是一个32位的保护模式程序。它的主要任务是建立和维护一个支持虚拟机的框架。例如,它要创建,运行和结束一个虚拟机。VMM是众多的系统VxD程序之一,它被放在你的系统目录下的VMM32.VxD文件中。VMM本身是一个VxD程序,但它被当作一个监视其他VxD程序的监视器。让我们来看一下Windows95的启动次序:
  1. 加载io.sys。
  2. 执行config.sys和autoexec.bat。
  3. 调用win.com。
  4. win.com运行VMM32.VxD,VMM32.VxD实际上是个简单的dos的exe文件。
  5. VMM32.VxD用xms驱动程序把VMM加载到扩展内存。
  6. VMM初始化自身及其它的默认VxD。
  7. VMM把机器转入到保护模式并创建系统虚拟机。
  8. 最后被加载的虚拟外壳设备在系统虚拟机上通过运行krnl386.exe来启动Windows。
  9. krnl386.exe加载所有的文件,最后是Windows95外壳。
正如你所看到的,VMM是第一个被加载到内存的VxD程序。它创建系统虚拟机并初始化其他的VxD程序。它也为这些VxD程序提供许多服务。
VMM和VxD的操作模式和真正的程序不同。在大多数时候,它们是潜伏的。当应用程序在系统中运行时,这些VxD程序没有被激活。当某些需要它们处理的中断/错误/事件发生时,它们才被唤醒。
VMM是不可重入的。这意味着VxD程序必须使它们的访问和VMM服务同步。在有些情况下调用VMM服务是不安全的,比如VMM正在处理一个硬件中断。在这段时间内,VMM是不答应重进入的。作为一个VxD编写者,你必须对你的所作所为极度的小心。记住,你是在最高特权级别,第0层级别,假如你代码有错的话,谁也管不到。

虚拟设备驱动程序

虚拟设备驱动程序被简称为VxD。x 代表各种设备的名字,如虚拟键盘驱动程序(vkd),虚拟鼠标驱动程序(vmd)等等。VxD程序是硬件成功初始化的途径。记得dos程序认为它们拥有系统的一切,当它们在虚拟机中运行时,Windows需要给它们一个实机器的替身。VxD程序就是这些替身。VxD程序通常虚拟一些硬件设备,所以,例如当一个dos程序认为它在同键盘通讯时,实际是虚拟键盘驱动程序在和dos程序通讯。一个VxD程序通常控制真正的硬件设备并对该设备在各个虚拟机之间的共享进行治理。

尽管如此,并不是说每个VxD程序必须和一个硬件设备相连。虽然VxD程序是用来虚拟硬件设备的,但是我们也可以把VxD程序看作是在第0级别的dll。例如,假如你需要做一些只有在第0级别才能做的工作,你就可以编一个VxD程序来为你完成这个工作。这样,由于此VxD程序并没有虚拟任何设备,你就可以把它仅仅看作是你的程序的扩展。
在我们更深入的讨论VxD和创建我们的VxD程序之前,让我先说一些有关于VxD的事情。
  • VxD程序是Windows 9x特有的,它在Windows NT下不能运行。所以假如你的程序是依靠VxD的,它就不能被移植到Windows NT平台上去。
  • VxD是系统中权力最大的实体。由于它们可以对系统作任何事情,所以它们是极度危险的。一个恶意的/错误的VxD程序可以毁掉整个系统。对于恶意的/错误的VxD程序没有任何的保护措施。
  • 通常的,不用VxD也有很多办法能达到你的目的。在采用VxD的解决办法之前一定要三思。假如用其他的可以在第三层级别实施的办法,就使用这个办法。
Windows 95下有两种VxD:
  • 静态VxD
  • 动态VxD
静态VxD是那些从系统启动就被加载,在系统关闭之前一直存在于内存中的VxD程序。这种VxD可以追溯至Windows 3.x的时代。动态VxD时只有Windows 9x下才有的。动态VxD程序可以在需要的时候被加载/卸载。这些程序大多数都是用来控制设置治理器和输入输出监视器加载的即插即用设备的。你可以在你的win32应用程序里加载或卸载动态VxD程序。

VxD程序之间的通讯

VxD程序,包括VMM,通过以下三种途径在相互之间进行通讯:
  • 控制消息
  • 服务API
  • 回调

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表