IMAGE_FILE_LARGE_ADDRESS_AWARE и переключатель ОС 3 ГБ

Если приложение Windows имеет IMAGE_FILE_LARGE_ADDRESS_AWARE установленный в заголовке изображения (с помощью флага компилятора / LARGEADDRESSAWARE), это обычно позволяет 32-разрядному приложению использовать более 2 ГБ памяти (имеет смысл только в том случае, если 32-разрядная операционная система установила переключатель 3GB в boot.ini). См. Статью MSDN / 3 ГБ для получения дополнительной информации.

У меня такой вопрос: что произойдет, если вы запустите это приложение в системе, в которой НЕ установлен переключатель 3 ГБ. Это просто игнорируется? Или приложение попытается использовать кучу 3 ГБ и получит ошибки нехватки памяти, потому что в пользовательском пространстве доступно только 2 ГБ?

Я постоянно слышу, что переключатель LARGEADDRESSAWARE игнорируется для систем с 2 ГБ пользовательского пространства, но не могу найти официальную документацию Microsoft по этому поводу.

Заранее спасибо.

Ответов (2)

Решение

Basically the IMAGE_FILE_LARGE_ADDRESS_AWARE tells the system, "I know that addresses with the high bit set are not negative, and can handle them". If the system is prepared to provide user mode addresses above 2GB, then it will. If the system is not prepared to give those addresses (ie., a 32-bit Windows OS without the /3GB setting), the process can't get those addresses anyway - but no harm done.

Also note that if an image has the IMAGE_FILE_LARGE_ADDRESS_AWARE bit set it will get access to address space above 2GB on Win64 systems, which do not support (or need) the /3GB switch. A 32-bit application will get an address space of something close to 4GB and a 64-bit application will get a huge address space - 7TB to 8TB depending on the platform (64-bit builds set the bit by default).

http://msdn.microsoft.com/en-us/library/aa366778.aspx#memory_limits

The switch is ignored, if you can call it that. For once, Microsoft actually managed to come up with a descriptive name.

The flag means exactly what it says. This image file is aware that large addresses exist. That is, it won't crash, if it is given a pointer above the 2GB boundary.

And that's all. The OS doesn't have to treat the process special in any way. It simply indicates that if the OS is able to provide more than 2GB memory, this process can handle it without crashing. You can make a simple hello world application which never uses more than 1.5MB, and still has this flag set. It doesn't mean "I want to use 3GB of memory", it means "When I request memory, I don't care if it's above or below the 2GB boundary".

Таким образом, поскольку флаг не требует, чтобы ОС выполняла какие-либо особые действия, ОС просто не будет делать ничего особенного, если она не может делать ничего особенного.