Может ли 32-битный процесс получить доступ к дополнительной памяти на 64-битной ОС Windows?

136
10

Из того, что я понимаю, 32-битный процесс может получить доступ только к 2 ГБ памяти на 32-битных окнах без переключателя /3GB и что часть этой памяти используется ОС по своим собственным дьявольским причинам. Это похоже на мой опыт, поскольку у нас есть приложение, которое падает, когда оно достигает 1,2 - 1,5 ГБ ОЗУ с исключениями из памяти, хотя по-прежнему имеется много доступной памяти.


Мой вопрос: будет ли перемещение этого 32-битного приложения на 64-битные окна, чтобы он мог получить доступ к более чем 1,5 ГБ памяти, которые он может сейчас? Или само приложение должно быть обновлено до 64 бит?

спросил(а) 2021-01-19T21:09:57+03:00 9 месяцев назад
1
Решение
163

В новых версиях Visual Studio есть новый флаг, который делает 32-разрядные приложения "большим адресным пространством". В основном, что он делает, говорит, что если он загружается в 64-битную версию Windows, тогда он получит 4 ГБ (предел 32-разрядных указателей). Это, безусловно, лучше, чем 2 или 3 ГБ, вы получаете 32-битные версии окон. См. http://msdn.microsoft.com/en-us/library/aa366778.aspx:


Самое примечательное:

Ограничения на память и адресное пространство различаются по платформе, операционной системе, и Значение IMAGE_FILE_LARGE_ADDRESS_AWARE структуры LOADED_IMAGE и Используется 4-гигабайтная настройка (4GT). Установлен IMAGE_FILE_LARGE_ADDRESS_AWARE или очистить, используя /LARGEADDRESSAWARE.



Также см.: http://msdn.microsoft.com/en-us/library/wz223b1z.aspx

ответил(а) 2021-01-19T21:09:57+03:00 9 месяцев назад
103

Да, при правильных обстоятельствах 32-разрядный процесс в Windows может получить доступ к полному 4 ГБ памяти, а не к 2Gb, который обычно ограничен.


Для этого вам необходимо следующее:

    Приложение должно работать на 64-разрядной ОС
    Приложение должно быть скомпилировано с флагом /LARGEADDRESSAWARE.
    Приложение должно быть проверено, чтобы убедиться, что оно действительно работает правильно в этом случае.;) (в частности, код, который опирается на все указатели, указывающие на адреса ниже границы 2 ГБ, очевидно, не будет работать здесь)

ответил(а) 2021-01-19T21:09:57+03:00 9 месяцев назад
66

Ваше приложение будет ограничено размером указателя, в вашем примере 32 бита.


Если вашему приложению было доступно больше памяти, вам понадобится какая-то сегментированная архитектура памяти, как у нас было в 16-битные дни, когда приложения использовали 16-битные указатели и смещения для доступа к полному 32-битовому пространству памяти.

ответил(а) 2021-01-19T21:09:57+03:00 9 месяцев назад
65

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

ответил(а) 2021-01-19T21:09:57+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема