Виртуальное адресное пространство в 64-битных системах, работающих в режиме совместимости

Я видел, что в 64-битной ОС Windows доступное виртуальное адресное пространство пользователя составляет 8 террабайт. Но если программа, которую мы выполняем, работает в режиме 32-битной совместимости, остается ли эта часть пользовательского пространства доступной? или он ведет себя как обычная 32-битная ОС и дает только 2 ГБ адресного пространства пользователя?

6 ответов

Решение

У Microsoft есть диаграмма, показывающая различные ограничения: Ограничения памяти для выпусков Windows

Подводя итог только виртуальному адресному пространству пользовательского режима:

  • 32-битная Windows:
    • 32-битный процесс: 2 ГБ по умолчанию; 3 ГБ с /LARGEADDRESSAWARE:YES и 4GT
  • 64-битная Windows (архитектура x64):
    • 32-битный процесс: 2 ГБ по умолчанию; 4 ГБ с /LARGEADDRESSAWARE:YES
    • 64-битный процесс: 8 ТБ по умолчанию; 2 ГБ с /LARGEADDRESSAWARE:NO

4GT имеет 4-гигабайтный тюнинг:

  • XP: /3GB переключатель boot.ini
  • Vista: bcdedit /set increaseuserva 3072

Марк Руссинович сделал сообщение в блоге, объясняющее многие из этих ограничений: Расширение границ Windows: виртуальная память

Следует отметить, что при запуске 32-разрядного процесса на IIS 6.0+ с 64-разрядной машиной / ОС процесс может адресовать до 4 ГБ памяти.

Ваш процесс будет видеть виртуальное адресное пространство 4 ГБ, только если он работает как 32-разрядный процесс. Он не сможет адресовать что-либо выше.

Что касается аппаратного обеспечения, когда вы работаете в режиме совместимости (т.е. установлен IA32_EFER.LMA и бит L очищен в дескрипторе сегмента CS), сегменты ведут себя как 32-битные сегменты. То есть:

  • база сегмента ограничена 32 битами.
  • предел сегмента также ограничен 32 битами (используется бит G).

Это эффективно ограничивает вас до 4 ГБ виртуальных адресов. Я не знаком с тем, как ОС разделяет виртуальную память в различных режимах, но это аппаратный предел. (извините... я аппаратный парень, а не эксперт по ОС)

Мой оригинальный ответ был довольно плохим. Вот ссылка, которая объясняет, что JaredPar говорил довольно хорошо.

http://msdn.microsoft.com/en-us/library/ms189334.aspx

Если ваша программа работает как 32-битный процесс в подсистеме Wow64, она увидит то же адресное пространство, что и в реальной 32-битной ОС. Без специальных опций 32-битный процесс будет иметь 2 ГБ памяти.

Единственная разница - доступная память, если вы используете опцию LargeAddressAware. В обычном 32-битном процессе это позволяет использовать 3 ГБ адресуемой памяти. В процессе Wow64 он может видеть до 4 ГБ ( источник)

Другие вопросы по тегам