我有一个32位应用程序,包含一个exe和多个dll。 exe已使用/ LARGEADDRESSAWARE标志集构建。所以我希望在64位操作系统上我应该获得4 GB的用户地址空间。但在一些64位Win 7系统上,我只获得2 GB的用户地址空间。如果重要,物理内存为8 GB。这种行为可能是什么原因?
答案 0 :(得分:2)
浏览完MSDN后,我发现了以下内容:
在http://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx上MEMORYSTATUSEX
(http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx)使用的GlobalMemoryStatusEx
页面)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的地址。
所以结论是,这可能取决于系统的配置。也许您可以使用表格,每个系统获得的内存量以及一些重要的系统配置设置来完成您的问题,在这种情况下我们可能会发现一种模式。
答案 1 :(得分:-1)
问题是一个应用程序有一个整体必须是大的Adress意识 - 所以指针将被视为无符号。
然而,如果"某些"系统你使用的一些DLL并不是大型的adressaware,这使你的整个程序不能识别大地址。
http://blogs.msdn.com/b/oldnewthing/archive/2010/09/22/10065933.aspx