Приложение с установленным флагом LARGEADDRESSAWARE получает меньше виртуальной памяти

У меня есть 32-разрядное приложение, состоящее из одного exe и нескольких dll. Exe был построен с флагом /LARGEADDRESSAWARE. Поэтому я ожидаю, что на 64-битной ОС я должен получить 4 ГБ адресного пространства пользователя. Но на некоторых 64-битных системах Win 7 я получаю только 2 ГБ адресного пространства пользователя. Физическая память составляет 8 ГБ, если это имеет значение. Что может быть причиной такого поведения?

Ответ 1

После просмотра MSDN я обнаружил следующее:

В http://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx (страница MEMORYSTATUSEX, которая используется GlobalMemoryStatusEx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx)) описание для ullTotalVirtual:

это значение составляет приблизительно 2 ГБ для большинства 32-разрядных процессов на процессоре x86 и около 3 ГБ для 32-разрядных процессов, которые имеют большой адрес, работающий в системе с поддержкой 4-гигабайтной настройки.

Страница настройки 4 ГБ: http://msdn.microsoft.com/en-us/library/windows/desktop/bb613473(v=vs.85).aspx, и она говорит что-то вроде:

В 64-разрядных версиях Windows 32-разрядные приложения, отмеченные флагом IMAGE_FILE_LARGE_ADDRESS_AWARE, имеют доступное адресное пространство объемом 4 ГБ.

Реализации Itanium для Windows Server 2003: до SP1 32-разрядные процессы имеют доступное только адресное пространство объемом 2 ГБ.

Кроме того, страница ограничений памяти (http://msdn.microsoft.com/en-us/library/aa366778.aspx#memory_limits) может пригодиться, если вы хотите определить общую память, которую поддерживает ваша система.

Однако реальная полезная информация поступает из блога Марка Руссиновича: http://blogs.technet.com/b/markrussinovich/archive/2008/07/21/3092070.aspx

В то время как 4 ГБ является лицензированным пределом для 32-разрядных клиентских SKU, эффективный предел фактически ниже и зависит от системного набора микросхем и подключенных устройств. Причина в том, что карта физического адреса включает в себя не только ОЗУ, но и память устройства, а системы x86 и x64 отображают всю память устройства под границей адреса 4 ГБ, чтобы оставаться совместимыми с 32-разрядными операционными системами, которые не знают, как обращаться адресов более 4 ГБ.

Таким образом, вывод заключается в том, что да, это может зависеть от конфигурации системы. Возможно, вы можете заполнить свой вопрос таблицей с объемом памяти, который вы получаете в каждой системе, и некоторыми важными настройками конфигурации системы, и мы могли бы обнаружить шаблон в этом случае.

Ответ 2

Проблема заключается в том, что приложение имеет целое значение, которое должно быть большим. Знание адреса - так, чтобы указатели обрабатывались как unsigned.

Если, однако, в "некоторой" системе некоторая используемая вами DLL не является большой adressaware, это означает, что вся ваша программа не имеет большого адреса.

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