VXD技术内幕(1)(Bahl翻译) (0分)

  • 主题发起人 主题发起人 Bahl
  • 开始时间 开始时间
B

Bahl

Unregistered / Unconfirmed
GUEST, unregistred user!
[h2]
虚拟设备驱动程序基础(上篇)​
[/h2] 在这篇教程中,我假定读者您已经对Intel 80x86保护模式非常熟悉。如果您对此一无所知,请先在http://developer.intel.com/design/pentium/manuals/
阅读一下Intel的文档。
内容:
Windows 95 是一个多线程的操作系统,运行在最高特权级——0级上。所有的应用程序都运行在最低特权级——3级上。因此,应用程序在系统操作上受到了严格限制,如它们不能使用CPU特权指令,它们不能直接访问I/O端口等等。您肯定对 gdi32, kernel32 与 user32这三个系统组件十分熟悉。您也许会认为它们应该运行在0级上。但是实际上它们运行在3级上。也就是说,它们不比Windows的计算器或扫雷游戏有更多的优先权。系统实际上是在虚拟机管理器 (VMM)与虚拟设备驱动程序(VxD)的控制下。
如果不是因为DOS的话,也许这种情况就不会发生了。在Windows 3.x时代,市场上有许多很成功的DOS程序。Windows 3.x必须能让它们与普通的Windows共同运行,否则它就会遭受商业上的失败。
这个难题并不容易解决。DOS与Windows程序大相径庭。DOS程序需要自己处理系统中的任何事情,如键盘,鼠标,CPU,内存,磁盘等等。它们并不知道如何与其他程序协调工作,而Windows程序则依赖于协作式的多任务。
解决的办法是让每个DOS程序在虚拟8086机上运行而Windows程序则在另一个名为系统虚拟机的虚拟机上运行。Windows负责为每个虚拟机分配CPU时间。
什么是虚拟机?虚拟机就是指执行应用程序的虚拟环境。一个虚拟机能让程序在它之中运行就象在真正的机器上运行一样。因此程序不知道自己是在虚拟机中运行。虚拟机能像真正的机器那样对程序做出反应,它就像真家伙一样。
您可以把真正的机器与它的软件的接口看作是一种API。这种API是由中断,BIOS调用与I/O端口组成的。Windows在某种程度上很好地模仿了这种API,运行在虚拟机中的程序运作起来就跟运行在真正的机器上一样。
为了协调与监控虚拟机,Windows需要一个程序。这个程序就是虚拟机管理器。
虚拟机管理器
VMM是一个32位保护模式程序。它的主要职责是建立与维护支持虚拟机的框架。也就是说,它负责建立,运行与终止虚拟机。VMM是存储于位于系统文件夹的VMM32.VXD中的许多系统VXD之一。它也是一个VXD,但是它可以看作是其他VXD的监督与管理者。让我们看一看Windows 95 的启动顺序:
1 io.sys 被载入内存。
2 处理config.sys 与 autoexec.bat 。
3 调用win.com 。
4 win.com 调用VMM32.VXD 。
5 VMM32.VXD 使用XMS驱动程序将VMM载入扩展内存。
6 VMM初始化它自己与其他默认的虚拟设备驱动程序。
7 VMM将机器转换到保护模式并建立系统虚拟机。
8 虚拟 Shell 设备最后载入。它通过运行krnl386.exe 来在系统虚拟机中启动Windows。
9 krnl386.exe 载入其他文件。
就像您所看见的那样,VMM是第一个载入内存的VXD。它建立了系统虚拟机并初始化其他的VXD。它还向那些VXD提供许多服务。
VMM与VXD的运作模式与真正的程序大不相同。它们在绝大多数时间内是静止的。当应用程序在系统中运行时,这些VXD并未激活。它们只有在需要引起它们注意的中断/错误/事件发生时才会被唤醒。
VMM是不可重入的。这意味着VXD必须将它们对VMM服务的访问同步化。在某些情况下调用VMM服务是很不安全的,比如当一个硬件中断正在接受服务时。在这段时间内,VMM不能容忍重入。您作为VXD编写者,必须对您正在做的事情特别小心。请记住,没有任何程序会照管您的代码中的错误,因为您是在0级上运行。
虚拟设备驱动程序
虚拟设备驱动程序缩写为VXD。X是指设备名称,比如虚拟键盘驱动程序,虚拟鼠标驱动程序等等。VXD是成功进行硬件虚拟化的关键。要记住,DOS程序需要自己处理系统中的任何事情。VXD经常虚拟化某些硬件设备。所以,当一个DOS程序在与键盘互相作用时,它实际上是在虚拟化键盘设备。一个VXD经常控制硬件设备并管理VM之间的设备共享。
但是,VXD不一定非要与硬件设备相联系不可。VXD是用来虚拟化硬件设备的,但我们也可以把它们看作是在0级上运行的DLL。例如,如果你需要一些在0级才有的功能,你可以写一个VXD。你可以把VXD看作是你的程序的扩展。但此时它并没有虚拟化任何硬件设备。
在继续深入探索VXD之前,让我先强调一些要点:
1 VXD是专门为Windows 9x设计的。它们不能在Windows NT上运行。所以,如果你的程序依赖于VXD,它将不能被移植到Windows NT平台上。
2 VXD是系统中最强大的实体。因为它们可以对系统做任何事,所以它们十分危险。一个运行失常的VXD能让系统崩溃!
3 通常,我们不需要使用VXD就能达到程序设计目标。在使用VXD前一定要深思熟虑。能不用VXD就尽量不用。
在Windows 95 中有两种VXD。
1 静态VXD。在系统启动时加载,在系统关闭时卸载。
2 动态VXD。在需要时加载。
 
请帮忙提前一下!
 
好像跟win32asm.yeah.net上面的差不多?
 
vxd在2000下已经被微软抛弃了,研究他干吗?我现在已经全面转入2000,喜新厌旧。:)
 
Bahl,E文不错,能给大家翻译一下这篇文章吗?是关于Borland如何起死回生的,
可能有些难度[8D]
http://www.fastcompany.com/online/60/borland.html
 
Bahl:翻译的东西好像很多。有没有集中的地方放老兄大作?
 
后退
顶部