让Windows让我映射1 GB的虚拟内存

时间:2010-08-28 00:12:27

标签: c++ windows winapi

我正在使用CreateFileMapping和MapViewOfFile来尝试映射几乎1 GB的文件。我在扩展文件方面遇到了一些问题,所以我想我会尝试使用1 GB大小的CreateFileMapping。这比实际文件大,但它适用于较小的文件。

似乎我可以几乎到1 GB的映射,但不是所有的方式。它大约是16 MB,短于1 GB。

我正在使用SysInternals VMMap程序来查看测试程序中各个部分的布局。这对我来说很奇怪。 VMMap向我显示我的地图后面有免费的虚拟内存空间!

为什么我不能使用它?

看起来有点像这样:
0x3F6E0000< - 这件作品被分配给我的测试程序
0x406E0000< - 这件作品是免费的,大约800 MB!把它给我!

关于0x40000000的内存区域是否有魔力?如果是这样,那为什么它让我用掉它的0x6E0000?

顺便说一下,测试程序在64个单独的段中使用MapViewOfFile,这就是为什么0x3F6E0000片段不是那么大。

1 个答案:

答案 0 :(得分:1)

这是一个很长的镜头,但它可能是在0x40000000(可能是DLL?)附近映射的小东西,并且因为内核找不到你想要的连续的 VA空间(即你已经够了,但它已经分裂了),它失败了。如果你想在巨大的文件中映射,那么在modern architecture上就容易得多了 - 因为一旦你减去所有的DLL和堆,你只能为Windows上的用户模式进程获得1.5GB的保证VA空间。