Выделение более 4 МБ закрепленной непрерывной памяти в ядре Linux
Для некоторого взаимодействия с устройством PCI, которое создается, мы хотели бы создать большие непрерывные фрагменты памяти, к которым может получить доступ плата. Как сейчас, самая большая часть памяти, которую я смог выделить, составляет 4 мегабайта. Мне интересно, есть ли какие-либо методы для создания больших регионов.
Я знаю, что для этого могу использовать параметр загрузки mem=
, но по причинам numa я бы предпочел не идти по этому маршруту. Если, с другой стороны, кто-то знал способ сделать это, но распределить его по узлам numa, это было бы хорошо.
Как я уже сказал, в настоящее время ограничено 4 мегабайтами. В настоящее время выделение выполняется __alloc_pages
, которое ограничено MAX_ORDER
. MAX_ORDER
- константа времени компиляции, и я также обеспокоен тем, что ее редактирование может иметь последствия в других местах.
Спасибо.
Ответы
Ответ 1
Если вы можете скомпилировать ваш драйвер устройства PCI в ядро (то есть не связанное как модуль), вы можете попробовать выделить память во время загрузки. Это должно позволить вам обходить верхние границы динамических распределений. Обратитесь к драйверам устройств Linux, изд. 3 ч. 8 для деталей.
Ответ 2
CMA (Смежный Memory Allocator) - лучшее решение для вашей ИМО. Вам просто нужно отправить новое ядро.