Виртуальное адресное пространство в 64-битных системах, работающих в режиме совместимости
Я видел, что в 64-битной ОС Windows доступное виртуальное адресное пространство пользователя составляет 8 террабайт. Но если программа, которую мы выполняем, работает в режиме 32-битной совместимости, остается ли эта часть пользовательского пространства доступной? или он ведет себя как обычная 32-битная ОС и дает только 2 ГБ адресного пространства пользователя?
6 ответов
У Microsoft есть диаграмма, показывающая различные ограничения: Ограничения памяти для выпусков Windows
Подводя итог только виртуальному адресному пространству пользовательского режима:
- 32-битная Windows:
- 32-битный процесс: 2 ГБ по умолчанию; 3 ГБ с
/LARGEADDRESSAWARE:YES
и 4GT
- 32-битный процесс: 2 ГБ по умолчанию; 3 ГБ с
- 64-битная Windows (архитектура x64):
- 32-битный процесс: 2 ГБ по умолчанию; 4 ГБ с
/LARGEADDRESSAWARE:YES
- 64-битный процесс: 8 ТБ по умолчанию; 2 ГБ с
/LARGEADDRESSAWARE:NO
- 32-битный процесс: 2 ГБ по умолчанию; 4 ГБ с
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 говорил довольно хорошо.
Если ваша программа работает как 32-битный процесс в подсистеме Wow64, она увидит то же адресное пространство, что и в реальной 32-битной ОС. Без специальных опций 32-битный процесс будет иметь 2 ГБ памяти.
Единственная разница - доступная память, если вы используете опцию LargeAddressAware. В обычном 32-битном процессе это позволяет использовать 3 ГБ адресуемой памяти. В процессе Wow64 он может видеть до 4 ГБ ( источник)