【问题标题】:Make Windows let me map 1 GB of virtual memory让 Windows 让我映射 1 GB 的虚拟内存
【发布时间】:2010-08-28 00:12:26
【问题描述】:

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

似乎我可以几乎获得 1 GB 的映射,但不是一路。它比 1 GB 少了大约 16 MB。

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

为什么我不能使用它?

看起来有点像这样:
0x3F6E0000 0x406E0000

0x40000000 以上的内存区域有什么魔力吗?如果是这样,那它为什么让我用完它的 0x6E0000 呢?

顺便说一句,测试程序在 64 个单独的段中使用 MapViewOfFile,这就是为什么 0x3F6E0000 块没有那么大的原因。

【问题讨论】:

  • 别给我们留下悬念,详情栏说什么?

标签: c++ windows winapi


【解决方案1】:

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

【讨论】:

  • 这是一个很好的理论。会不会有 VMMap.exe 无法显示的映射的东西?
  • 可能是它太小而无法显示在图表中,也可能是其他原因 - 就像我提到的那样,我在这里主要是在理论上。
  • 这个其实很有可能,DLL的基地址往往是0x4000000。
  • 我不知道这个答案是否正确,但目前认为它是最好的。
猜你喜欢
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2011-05-23
  • 1970-01-01
  • 2011-12-31
  • 2015-01-26
相关资源
最近更新 更多