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