Можно ли вообще выделить большие (то есть 32 МБ) физически смежные области памяти из кода ядра во время выполнения (то есть без использования bootmem)? Из моих экспериментов кажется, что невозможно получить что-то большее, чем 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)
Может ли это сработать, если дать достаточно времени для запуска?