内存映射文件之剖析(一)

发表于:2007-07-01来源:作者:点击数: 标签:
内存映射文件之剖析 作者:xrbeck 内存映射文件(Mapping File)是 Windows 内存管理中的重要一环,也是编程 技术中比较高级的一个话题。目前关于这方面的资料比较少,而其实内存映射 文件其实对我们的对于Windows的内存了解很重要,在这里把笔者的心得写 出来
 

内存映射文件之剖析

                                                                              作者:xrbeck

 

内存映射文件(Mapping File)是Windows内存管理中的重要一环,也是编程

技术中比较高级的一个话题。目前关于这方面的资料比较少,而其实内存映射

文件其实对我们的对于Windows的内存了解很重要,在这里把笔者的心得写

出来,和大家一起讨论。

 

                          内存空间及映射

    相信大家都已经知道,在WIN32中和16位Windows的最大不同就是WIN32

引入了面向进程的独立虚拟地址,这个地址的寻址空间达到了4GB(2^32),当然

这个地址是虚拟的。每个进程拥有自己的独立空间,进程A的地址0X10000000

和进程B的地址0X10000000没有丝毫的联系(只是在用户进程地址空间,不包括其他

范围)。说到这个地方可能大家会奇怪了,我的机器中只有64M(或者128M等)内存呀,怎么会有这么大的地址空间呢?而进程A和进程B的同样的地址又会如何识别使得不冲突呢?

   这里先让我们来看看Windows的内存空间(注:这里我们都以Win9X来讨论,

当然Win2K或者WinNT和9X在某些方面会不大一样)

                    

                     0x00000000----0x003FFFFF     4M      属于系统保留区域

 

            0x00400000---0x7FFFFFFF    2G-4M   面向进程独立的地址空间

 

            0x80000000--0xBFFFFFFF     1G       Win32共享的空间,用来存放

                                                  内存映射文件等

         

            0xC0000000---0xFFFFFFFF    1G       用来存放Vxd等

 

有上面的列表可知,用户的程序运行在第二个地址范围中,而我们用来讨论的映射文件则放在了第三个地址范围中.而我们调试程序的时候经常有看到某个指针变量的值

为多少,这个值就指的是虚拟地址空间中的地址.

    那么Windows是如何将这个虚拟地址空间转化为实际的PC上的RAM的地址呢?

这就牵涉到映射的问题,也就是以页(page)为基本单位实现两个地址的对应.这个相信

在操作系统这门课里已经学习过,这里就不再重复了.在上面这个问题中,地址情况

可能如下:

           进程A                   RAM                    进程B

 

 

 

 

0x10000000

原文转自:http://www.ltesting.net