Здравствуйте! Есть задача выделения большого буфера (4-48GiB) памяти для приложения, который не будет выгружаться (аналог NonPagedPool из Windows). Как я понимаю, из приложения этого можно достичь путем обычного выделения памяти (malloc()) + mlock(). Но при очередном перезапуске приложения может случиться так, что не всю память удастся выделить.Поэтому было решено использовать память, получаемую из драйвера.
Решение на мой взгляд выглядит таким образом:
-выделение в драйвере при загрузке ОС памяти с помощью __get_free_pages(GFP_KERNEL) или kmalloc(GFP_KERNEL);
-SetPageReserved();
-mmap() памяти из приложения.
Есть следующие вопросы:
1.В этом случае получается гарантированно невыгружаемая память?
2.Флага GFP_KERNEL достаточно? Нет необходимости во флаге __GFP_HIGHMEM? Речь идет о x86-64 (кстати, где в x86-64 граница Low и High Memory ядре?).
3.Нет ли ограничений на mmap() больших объемов памяти в пользовательское приложение?
4.Можно ли аналогичное решение применить для x86+PAE? Что нужно изменить?
Возможно, это не самый короткий путь. Если есть варианты, предлагайте, пожалуйста.