如果Windows应用程序在映像头中设置了IMAGE_FILE_LARGE_ADDRESS_AWARE
(通过/ LARGEADDRESSAWARE编译器标志),这通常是允许32位应用程序使用超过2GB的内存(仅在有意义的情况下才有意义) 32位操作系统在boot.ini中设置了3GB开关。有关详细信息,请参阅MSDN article /3GB。
我的问题是,如果您在没有设置3GB开关的系统上运行此应用程序会发生什么。它被忽略了吗?或者应用程序是否会尝试使用3GB堆并获取内存不足错误,因为用户空间只有2GB可用?
我一直听到有消息称LARGEADDRESSAWARE交换机在2GB用户空间系统中被忽略,但无法在此找到任何官方的Microsoft文档。
提前致谢。
答案 0 :(得分:20)
基本上IMAGE_FILE_LARGE_ADDRESS_AWARE
告诉系统,“我知道高位设置的地址不是负数,可以处理它们”。
如果系统准备提供超过2GB的用户模式地址,那么它将会。如果系统没有准备好提供这些地址(例如,没有/ 3GB设置的32位Windows操作系统),则该过程无论如何都无法获得这些地址 - 但不会造成任何损害。
另请注意,如果图像设置为IMAGE_FILE_LARGE_ADDRESS_AWARE
,则在Win64系统上可以访问2GB以上的地址空间,这些地址空间不支持(或不需要)/ 3GB开关。 32位应用程序将获得接近4GB的地址空间,64位应用程序将获得巨大的地址空间 - 7TB到8TB,具体取决于平台(64位构建默认设置该位)。
http://msdn.microsoft.com/en-us/library/aa366778.aspx#memory_limits
答案 1 :(得分:10)
如果您可以调用它,则忽略该开关。有一次,微软实际上设法提出了一个描述性名称。
旗帜正是它所说的。此图像文件识别存在大地址。 也就是说,如果指针位于2GB边界之上,它就不会崩溃。
就是这样。操作系统不必以任何方式处理特殊处理。它只是表明如果操作系统能够提供超过2GB的内存,这个过程可以处理它而不会崩溃。 你可以制作一个简单的hello world应用程序,它从不使用超过1.5MB,并且仍然设置了这个标志。它并不意味着“我想使用3GB内存”,它意味着“当我请求内存时,我不在乎它是否高于或低于2GB边界”。
因此,由于该标志不需要操作系统做任何特殊操作,如果它没有任何特殊功能,操作系统就不会做任何特殊操作。