Win 95 下内存映射文件的工作原理及使用方法
一、引言
WIN32 API 为我们提供了一种进行文件操作的高效途径,即内存映射文件。
内存映射文件允许我们在 WIN32 进程的虚拟地址空间中保留一段内存区域,把目
标文件映射到这段虚拟内存之中。我们可以用存取内存数据的方式直接操作文件
中的数据,就好像这些数据放在内存中一样。而实际上,我们并没有、也不需要
调用 API 函数来读写文件,更不需要自己提供任何缓冲算法,操作系统将会为我
们完成这些工作。使用内存映射文件能给程序开发工作提供极大的方便,程序的
运行效率也非常高。
内存映射文件在 Windows NT 和 Windows95 中的实现机制略有不同,下面主
要介绍 Windows95 下内存映射文件的工作原理及使用方法。
二、Windows95 如何管理 WIN32 进程的内存空间
内存映射文件的实现与 Windows95 的内存管理有密切的关系,因此先讨论一
下 Windows95 在运行 WIN32 进程时的内存管理与划分。
在 Windows3.x 下,所有 Windows 应用程序共享单一的地址空间,任何进程
都能够对这一空间中属于其他进程的内存进行读写操作,甚至可以存取操作系统
本身的重要数据。在这种环境中,编写不当的应用程序或者带有恶意的应用程序,
就可能破坏其他程序的数据或代码,使得系统运行不正常,严重时甚至会导致系
统崩溃。
在实现了 WIN32 的操作系统 Windows NT 和 Windows95 中,每个 WIN32 进程
拥有自己的地址空间,一个 WIN32 进程不能存取另一个进程地址空间的私有数据,
两个进程可以用具有相同值的指针寻址,但所读写的只是它们各自的数据,这样
就大大减少了进程之间的相互干扰,增强了系统的健壮性;另一方面,每个 WIN32
进程拥有 4GB 的地址空间,但并不代表它真正拥有 4GB 的实际物理内存,而只是
操作系统利用 CPU 的内存分页功能提供的虚拟地址空间。在一般情况下,绝大多
数虚拟地址并没有物理内存与之对应,在真正可以使用这些地址空间之前,还要
由操作系统提供实际的物理内存。为虚拟地址提供实际物理内存的过程叫做
“提交”(Commit)。在不同情况下,系统提交的物理内存的类型是不
同的,可能是 RAM,也可能是硬盘模拟的虚拟内存。
Windows95 对 WIN32 进程地址空间的划分如下:
地址空间底部的 4MB 由 Windows95 用来维护与 DOS 和 16 位 Windows 的兼容
性。理想情况下,WIN32 进程应该不能访问这段内存,但由于实现上的困难,
Windows95 只能保护低端从 0x00000000 到 0x00000FFF 的 4KB 区域,这 4KB 区间
用来捕获 NULL 指针。从 0x80000000 到 0xBFFFFFFF 的 1GB 空间由所有的 WIN32
进程共享,内存映射文件就使用这段地址空间。高端的 1GB 空间由 Windows95 自
己使用,不像 Windows NT 那样,这段空间也没有受到保护,任何进程都可能破
坏其中的数据。
三、内存映射文件的工作原理
内存映射文件分三种情况,第一种是可执行文件的内存映射,主要由
Windows95 自身使用;第二种是数据文件的内存映射;最后一种是借助于页面交
换文件的内存映射。应用程序可以使用后面两种内存映射文件。