Доступ свыше 4GB памяти windows из под 32-битного приложения

Как получить доступ к всей памяти не используя файл подкачки? Если он нужен - при работе с оперативной памятью - система сама этим займётся. Я вижу два способа, AWE и "interprocess".

Можно ли функцию AllocateUserPhysicalPages заставить работать на обычных компьютерах? В Win10 эта функция тоже не работает?

Пример использования находится на сайте microsoft http://docs.microsoft.com/en-us/windows/win32/memory/awe-example

У меня на win7 x64 пример микрософта в x86 программе заканчивается ошибкой Cannot enable the SE_LOCK_MEMORY_NAME privilege. Все хорошо, только функция памяти требует привелегий? Это как? Т.е. 32-битное приложение не может использовать памяти более 4Гб через AWE окно, зато 64-битное может сьесть всю память? Есть ли другие способы работать из 32-битного приложения с всей памятью? (Совет - запустите из-под админа не подходит, если мы пишем какую бы то ни было утилиту, утилиты-же вроде блокнота паинта или другого редактора - не клянчат админские привелегии)

Mozilla-Firefox, например одно время плодил процессы, мне приходила идея плодить процессы для доступа к памяти больше чем 4GB, т.е. единственный выход - плодить процессы (interprocess)? (Имеется ввиду: создаём ещё один процесс, там делаем Alloc памяти, а эту дополнительную память читаем через ReadProcessMemory, или если запрещено привелегиями то через Pipe).

Если кто сталкивался с такой проблемой, как она у вас решена?


Ответы (2 шт):

Автор решения: Alex Guteniev

32-битная система, которая не сервер, не получает в принципе доступ к больше чем 4 ГБ физической памяти - см Physical Memory Limits: Windows 10¹.

Соотвественно, получение бо́льшего объёма памяти будет связано с работой в 64-разрядной системой.

Для работы с большим объёмом памяти в 64-разрядной системе проще всего собирать 64-разрядные приложения.


¹ Возможно, это ограничение можно как-то обойти, но даже если и можно, это будет нарушать лицензию (как и включение функции AllocateUserPhysicalPages там, где она не должна работать).

→ Ссылка
Автор решения: Roman R.

32-битное приложение может нарезервировать памяти свыше 4 GB посредством CreateFileMapping API и управлять всем этим "сверхквотным" объёмом. Что невозможно сделать так это одновременно весь этот объём памяти сделать адресно-доступным приложению посредством MapViewOfView: приложение сможет сделать видимым себе лишь до 4 GB (в максимальном случае) одновременно. Тем не менее можно выборочно убирать какие-то фрагменты (UnmapViewOfFile) и вместо этого добавлять новые.

The most important part made so obvious is that the 32-bit application succeeds in allocating well over 4 GB, which is maximal virtual address space it can ever get.

Там же есть prebuilt binary поиграться.

→ Ссылка