64 位进程中的 CreateFileMapping 大小限制

CreateFileMapping size limit in a 64-bit process

文件映射对象有大小限制吗?我问的原因是在 MSDN 的某个地方提到了 2GB 的限制(丢失轨道..)我还检查了这个示例,它也需要 2GB 的大小限制:

https://cpp.hotexamples.com/examples/-/-/CreateFileMapping/cpp-createfilemapping-function-examples.html

但是我在最新的 Win 10 上尝试了一个 40GB 的文件,没有问题,所以我有点担心,例如旧的 Windows 没有一些限制。

文件映射没有 2GB 的限制。您可以使用 3GB 选项启动 32 位 Windows,或者当 32 位进程 运行 在 64 位系统上运行时,如果设置了正确的 PE flag,您将获得完整的 4GB .所有这些限制都是理论上的,您在实践中永远无法达到它们。

您可以映射多大的视图取决于两件事;

  1. 您的进程地址中的连续空闲地址范围 space。
  2. 用于跟踪内存页面的可用内核内存。

第一个是 32 位系统的大限制,因为您进程的地址 space 与系统库、第 3 方库(anti-virus、注入的“调整”工具共享等)、PEB 和 TEB、系统区域、线程堆栈和硬件保留的内存。这通常会使您的空间远低于 2GB。任何需要超过 500MB 的设计都应该更改为仅根据需要在特定的较小范围内映射。

For a 64-bit process on 64-bit Windows, the virtual address space is the 128-terabyte range 0x000'00000000 through 0x7FFF'FFFFFFFF (KB889654 claims 8 TB but that only applies to < Windows 8.1)。任何可用范围都会变小,但您可以假设至少有几个 TB。 40GB 没问题,也不足以 运行 解决系统资源不足的问题。