Возможно ли вообще выделить большие (т.е. 32 Мб) физически непрерывные области памяти из кода ядра во время выполнения (т.е. без использования загрузочной памяти)? Из моих экспериментов кажется, что невозможно успешно получить что-то большее, чем 4 МБ, независимо от того, какие флаги GFP я использую. Согласно документации, которую я прочитал, GFP_NOFAIL должен заставить kmalloc просто ждать столько, сколько необходимо для освобождения запрошенной суммы, но из того, что я могу сказать, запрос просто зависает на неопределенный срок, если вы запрашиваете больше, чем доступно - не похоже, что он активно пытается освободить память для выполнения запроса (например, kswapd не работает). Есть ли какой-нибудь способ сказать ядру, чтобы оно начало агрессивно выгружать вещи, чтобы освободить запрошенное распределение?
Редактировать: Итак, из ответа Юджина я вижу, что невозможно получить 32-мегабайтный регион из одного kmalloc .... но есть ли возможность сделать это более хакерским способом? Например, определить самую большую доступную непрерывную область, а затем вручную перенести/заменить данные по обе стороны от нее?
Или как насчет такого:
1) Grab a bunch of 4mb chunks until you're out of memory.
2) Check them all to see if any of them happen to be contiguous, if so,
combine them.
3) kfree the rest
4) goto 1)
Может ли это сработать, если дать достаточно времени для запуска?