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

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


person Naveen    schedule 29.01.2009    source источник


Ответы (6)


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

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

  • 32-bit Windows:
    • 32-bit process: 2 GB by default; 3 GB with /LARGEADDRESSAWARE:YES and 4GT
  • 64-bit Windows (x64 architecture):
    • 32-bit process: 2 GB by default; 4 GB with /LARGEADDRESSAWARE:YES
    • 64-битный процесс: 8 ТБ по умолчанию; 2 ГБ с /LARGEADDRESSAWARE:NO

4GT — это 4-гигабайтный тюнинг:

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

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

person bk1e    schedule 29.01.2009
comment
Важно отметить, что в зависимости от создаваемых исполняемых файлов вам, возможно, придется использовать editbin для установки флага LARGEADDRESSAWARE в самом исполняемом файле PE, чтобы воспользоваться преимуществами дополнительного адресного пространства. - person Michael; 19.10.2010
comment
64-bit process: 8 TB by default; 2 GB with /LARGEADDRESSAWARE:NO — Даже это вариант для ограничения адресного пространства 64-битных процессов. Очень интересно! Никогда не знал, что даже уменьшение объема памяти возможно с помощью флагов. Интересно, какой вариант использования потребует такого уменьшения размера. Мы всегда хотим увеличить объем памяти, занимаемой нашим процессом. Хотя очень хорошая информация. - person RBT; 18.08.2016

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

person RussellH    schedule 29.01.2009
comment
В Windows 32-битный процесс может получить доступ только к 2 ГБ памяти. - person JaredPar; 29.01.2009
comment
Я предполагаю, что видел, может быть, неправильное слово. Я так понимаю, что более 2 ГБ были зарезервированы для ядра, но по-прежнему являлись частью виртуального адресного пространства для процесса, а 2 ГБ были доступны для распределения пользователями. - person RussellH; 29.01.2009

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

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

person RussellH    schedule 29.01.2009

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

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

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

person Nathan Fellman    schedule 29.01.2009

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

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

person JaredPar    schedule 29.01.2009
comment
/LARGEADDRESSAWARE:YES дает вам 4 ГБ виртуального адресного пространства в WoW64, а не 3 ГБ. - person bk1e; 29.01.2009
comment
@ bk1e, я не знал об этом. Мне потребовалось немного поиска в Google, но я смог подтвердить это и обновил свой пост. Я нахожу это очень странным изменением, но интересным. - person JaredPar; 29.01.2009

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

person Dave Black    schedule 12.04.2011