IMAGE_FILE_LARGE_ADDRESS_AWARE и 3GB OS Switch
Если приложение Windows имеет значение IMAGE_FILE_LARGE_ADDRESS_AWARE
, установленное в заголовке изображения (через флаг компилятора /LARGEADDRESSAWARE ), это обычно позволяет 32-разрядному приложению использовать более 2 ГБ памяти (имеет смысл только в том случае, если 32 -битная операционная система установила переключатель 3GB в boot.ini). Для получения дополнительной информации см. статью MSDN/3GB.
Мои вопросы: что произойдет, если вы запустите это приложение в системе, у которой нет набора переключателей 3GB. Это просто игнорируется? Или приложение попытается использовать кучу 3 ГБ и получить ошибки из памяти, потому что в пользовательском пространстве доступно только 2 ГБ?
Я продолжаю слышать анекдотически, что переключатель LARGEADDRESSAWARE игнорируется для систем с пространственным пространством 2 ГБ, но не может найти официальную документацию Microsoft по этому вопросу.
Спасибо заранее.
Ответы
Ответ 1
В основном IMAGE_FILE_LARGE_ADDRESS_AWARE
сообщает системе: "Я знаю, что адреса с высоким набором бит не являются отрицательными и могут обрабатывать их".
Если система готова предоставить адреса режима пользователя выше 2 ГБ, то это произойдет. Если система не готова предоставить эти адреса (то есть 32-разрядную ОС Windows без настройки /3GB), процесс не сможет получить эти адреса в любом случае, но никакого вреда не будет.
Также обратите внимание, что если изображение имеет бит IMAGE_FILE_LARGE_ADDRESS_AWARE
, он получит доступ к адресному пространству выше 2 ГБ на системах Win64, которые не поддерживают (или не нуждаются) переключатель /3GB. 32-разрядное приложение получит адресное пространство около 4 ГБ, а 64-битное приложение получит огромное адресное пространство - от 7 ТБ до 8 Тбайт в зависимости от платформы (64-разрядные сборки устанавливают бит по умолчанию).
http://msdn.microsoft.com/en-us/library/aa366778.aspx#memory_limits
Ответ 2
Переключатель игнорируется, если вы можете это назвать. На этот раз Microsoft на самом деле удалось создать описательное имя.
Флаг означает именно то, что он говорит. Этот файл изображения знает, что существуют большие адреса.
То есть, он не будет разбиваться, если ему задан указатель над границей 2 ГБ.
И это все. ОС не должна каким-либо образом обрабатывать этот процесс. Это просто указывает, что если ОС может обеспечить память более 2 ГБ, этот процесс может справиться с ней без сбоев.
Вы можете создать простое приложение hello world, которое никогда не использует более 1,5 МБ, и все еще имеет этот флаг. Это не означает, что "я хочу использовать 3 ГБ памяти", это означает "Когда я запрашиваю память, мне все равно, если она выше или ниже границы 2 ГБ".
Так как флаг не требует, чтобы ОС делала что-либо особенное, ОС просто не сделает ничего особенного, если нет ничего особенного, что он может сделать.