Доступ свыше 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 шт):
32-битная система, которая не сервер, не получает в принципе доступ к больше чем 4 ГБ физической памяти - см Physical Memory Limits: Windows 10¹.
Соотвественно, получение бо́льшего объёма памяти будет связано с работой в 64-разрядной системой.
Для работы с большим объёмом памяти в 64-разрядной системе проще всего собирать 64-разрядные приложения.
¹ Возможно, это ограничение можно как-то обойти, но даже если и можно, это будет нарушать лицензию (как и включение функции AllocateUserPhysicalPages там, где она не должна работать).
32-битное приложение может нарезервировать памяти свыше 4 GB посредством CreateFileMapping API и управлять всем этим "сверхквотным" объёмом. Что невозможно сделать так это одновременно весь этот объём памяти сделать адресно-доступным приложению посредством MapViewOfView: приложение сможет сделать видимым себе лишь до 4 GB (в максимальном случае) одновременно. Тем не менее можно выборочно убирать какие-то фрагменты (UnmapViewOfFile) и вместо этого добавлять новые.
Там же есть prebuilt binary поиграться.