10

我有一个包含一个 EXE 和多个 DLL 的 32 位应用程序。EXE 是用/LARGEADDRESSAWARE标志集构建的。所以我希望在 64 位操作系统上我应该获得 4 GB 的用户地址空间。但在某些 64 位 Win 7 系统上,我只获得 2 GB 的用户地址空间。

如果重要的话,物理内存是 8 GB。这种行为可能是什么原因?

4

2 回答 2

2

通过MSDN浏览后,发现如下:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx(该页面MEMORYSTATUSEXGlobalMemoryStatusEx( http://msdn.microsoft.com/ en-us/library/windows/desktop/aa366589(v=vs.85).aspx ) ) 的描述ullTotalVirtual是:

对于 x86 处理器上的大多数 32 位进程,该值约为 2 GB,对于在启用了 4 GB 调整的系统上运行的大地址感知的 32 位进程,该值约为 3 GB。

4GB 调整页面是: http: //msdn.microsoft.com/en-us/library/windows/desktop/bb613473 (v=vs.85).aspx它说的是:

在 64 位版本的 Windows 上,标有 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志的 32 位应用程序有 4 GB 的可用地址空间。

Windows Server 2003 的 Itanium 版本:在 SP1 之前,32 位进程只有 2 GB 的可用地址空间。

此外,如果您想确定系统支持的总内存,内存限制页面 ( http://msdn.microsoft.com/en-us/library/aa366778.aspx#memory_limits ) 可以派上用场。

然而真正有用的信息来自 Mark Russinowich 的博客:http: //blogs.technet.com/b/markrussinovich/archive/2008/07/21/3092070.aspx

虽然 4GB 是 32 位客户端 SKU 的许可限制,但有效限制实际上更低,并且取决于系统的芯片组和连接的设备。原因是物理地址映射不仅包括 RAM,还包括设备内存,x86 和 x64 系统将所有设备内存映射到 4GB 地址边界以下,以保持与不知道如何处理的 32 位操作系统兼容地址大于 4GB。

所以结论是,是的,这可能取决于系统的配置。也许您可以用一张表格来完成您的问题,其中包含您在每个系统上获得的内存量以及一些重要的系统配置设置,我们可能会在这种情况下发现一个模式。

于 2014-08-27T10:37:04.660 回答
-2

问题是一个应用程序有一个整体必须是大地址 - 以便指针被视为无符号。

但是,如果在“某些”系统上,您使用的某些 DLL 不是大地址感知的,这会使您的整个程序不感知大地址。

http://blogs.msdn.com/b/oldnewthing/archive/2010/09/22/10065933.aspx

于 2014-08-27T09:45:58.547 回答