内存映射文件之剖析
作者: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
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073