IMAGE_FILE_LARGE_ADDRESS_AWARE и ОС 3 ГБ - PullRequest
       16

IMAGE_FILE_LARGE_ADDRESS_AWARE и ОС 3 ГБ

16 голосов
/ 25 февраля 2009

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

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

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

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

Ответы [ 2 ]

20 голосов
/ 25 февраля 2009

В основном 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

10 голосов
/ 25 февраля 2009

Переключатель игнорируется, если вы можете так его назвать. На этот раз Microsoft действительно удалось придумать описательное имя.

Флаг означает именно то, что он говорит. Этот файл изображения знает , что существуют большие адреса. То есть он не потерпит крах, если ему будет указан указатель над границей в 2 ГБ.

И это все. ОС не должна обрабатывать процесс как-либо особенным. Это просто указывает на то, что , если ОС может предоставить более 2 ГБ памяти, этот процесс может справиться с этим без сбоев. Вы можете создать простое приложение hello world, которое никогда не использует больше 1,5 МБ и в котором установлен этот флаг. Это не означает «я хочу использовать 3 ГБ памяти», это означает «когда я запрашиваю память, мне все равно, находится ли она выше или ниже границы 2 ГБ».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...