① 内存的物理地址空间
VMM使用80386的保护模式管理内存。从认识CPU一章中,我们知道,在80386以后,系统能提供4GB的32位的虚拟空间。
私有区
共享区
系统区
DOS区
私有区地址是从4MB到2GB。这是Win32应用程序运行的空间。每个Win32的进程都有它自己的2GB(要减去4MB)的空间,被Win32应用系统用来存放自己的代码和资源。这块区域是私有的,因为每个Win32程序映射到不同的物理空间上。当一个Win32程序访问4MB空间内时,它其实访问的是映射的某物理空间。
共享区地址是从2GB到3GB。这个区域是被虚拟机内的所有应用程序共享的。系统DLL(user32,kernel32,gid32)和Win16进程(由于Win16要求在共享空间运行)都驻存在这里。
系统区地址是从3GB到4GB的线性空间的顶端。这里是Win9x为第0级的超级进程VMM和VxD专门开辟的区域,并且此空间也是共享的。
DOS区地址是从0到4MB的空间内,这个空间是专为DOS的应用程序留下的,另外,Win16应用程序堆栈的一小部分也放在这里。
② 内存的服务程序
VMM中使用了虚拟存储的技术,能够克服物理内存的限制。尽管在物理上不存在,但理论上4GB的空间是能被访问的。通过从RAM和次级存储器设备上交换(分页)代码和数据以及将代码和数据交换到RAM和次级存储器设备上以实现虚拟技术。因为VxD驻留在32位的保护模式部分,所以它应该可以直接访问所有的内存空间,但内存的管理是通过VMM来完成的,所以它只能通过存储器管理服务获得的内存空间。
Windows决定实际有效的虚拟存储器的数量和有效的磁盘空间的数量。实际有效的虚拟存储器的数量基于系统物理上的总量,可以手工指定。
存储器管理程序在外部程序需要时,会一直分配物理空间,直到物理存储器已经用尽。然后,它会从物理存储器移动4KB的代码或数据页到磁盘上,以使附加的物理存储器有效。Windows中是按4KB的大小来对内存空间进行分页的。这种分页对程序来说是透明的。如果程序企图访问某部分已交换到磁盘上的数据,则会产生一个页错中断。然后存储器管理程序将其页换出存储器,并恢复该程序所需要的那些页。
下面列出了Windows存储器管理服务。列出的服务构成了公共使用子集。
系统目标管理
Alloacte_Device_Cb_Area
设备虚拟V86页管理
Assign_Device_V86_Pages
系统页分配程序
HeapAllocate
HeapFree
系统页分配程序
CopyPageTable
MapIntoV86
ModifyPage bits
PageAllocate
PageLock
PageUnlock
PageGetAllocInfo
PhyIntoV86
查看保护方式中的物理设备存储器
MapehysToLiner
DataAccessServices
GetFristV86Page
对保护方式API的专用服务
实例数据管理
查看V86空间
中断处理程序
线程调度程序
- 虚拟设备
VxD的功能十分强大,它不但能"虚拟"某种设备,还能给别的VxD或应用程序提供服务。
VxD可以和VMM一起被静态地装入系统,也可以由应用程序主动地装入系统。因为VxD就在第0级工作,并且有极高的权限,所以VxD能访问任何的硬件,不仅可以访问任何的物理空间,还可以捕获软件中断和I/O端口以及其他程序对内存的访问,就连硬件中断也可以被它捕获。
① VxD的组成
安装一个VxD的过程有下面几个部分,如图3.3所示。
实模式的初始化代码和数据在完成以下4部分后,被系统销毁。
保护模式(PM)初始化代码部分,完成后销毁。
保护模式(PM)初始化代码数据,完成后销毁。
PM代码,包括设备过程、API和回调过程,以及服务例程。
PM数据,包括设备描述符块、服务表,以及全局数据。
② VxD的加载过程
Windows 9x支持静态加载和动态加载两种加载方式。静态加载的VxD是在Windows初始化时被自动加载的,只有当Windows结束运行后,它才会卸载。Windows 9x中可以通过两种方法来加载静态的VxD。
直接在SYSTEM.INI中加入如下一行代码:
Device =VxD_NAME
可以在Windows 9x注册表中的HKEY_LOCAL_MACHINE\ System\CurrentControlSet\Services\VxD\key\StaticVxD子键下加入如下的VxD的路径和名字:
VxD_NAME=PATHNAME
这种动态加载的VxD不是和VMM一起在Windows启动时一起装入内存的,而由应用程序或另外的VxD装入,并且也可以通过VxD或其他应用程序动态地删除,所以,动态的VxD就有很大的灵活性。