IMAGE_FILE_LARGE_ADDRESS_AWARE和3GB OS Switch

时间:2009-02-25 16:50:36

标签: winapi memory

如果Windows应用程序在映像头中设置了IMAGE_FILE_LARGE_ADDRESS_AWARE(通过/ LARGEADDRESSAWARE编译器标志),这通常是允许32位应用程序使用超过2GB的内存(仅在有意义的情况下才有意义) 32位操作系统在boot.ini中设置了3GB开关。有关详细信息,请参阅MSDN article /3GB

我的问题是,如果您在没有设置3GB开关的系统上运行此应用程序会发生什么。它被忽略了吗?或者应用程序是否会尝试使用3GB堆并获取内存不足错误,因为用户空间只有2GB可用?

我一直听到有消息称LARGEADDRESSAWARE交换机在2GB用户空间系统中被忽略,但无法在此找到任何官方的Microsoft文档。

提前致谢。

2 个答案:

答案 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边界”。

因此,由于该标志不需要操作系统做任何特殊操作,如果它没有任何特殊功能,操作系统就不会做任何特殊操作。