Подтвердить что ты не робот

Выделение более 4 МБ закрепленной непрерывной памяти в ядре Linux

Для некоторого взаимодействия с устройством PCI, которое создается, мы хотели бы создать большие непрерывные фрагменты памяти, к которым может получить доступ плата. Как сейчас, самая большая часть памяти, которую я смог выделить, составляет 4 мегабайта. Мне интересно, есть ли какие-либо методы для создания больших регионов.

Я знаю, что для этого могу использовать параметр загрузки mem=, но по причинам numa я бы предпочел не идти по этому маршруту. Если, с другой стороны, кто-то знал способ сделать это, но распределить его по узлам numa, это было бы хорошо.

Как я уже сказал, в настоящее время ограничено 4 мегабайтами. В настоящее время выделение выполняется __alloc_pages, которое ограничено MAX_ORDER. MAX_ORDER - константа времени компиляции, и я также обеспокоен тем, что ее редактирование может иметь последствия в других местах.

Спасибо.

4b9b3361

Ответ 1

Если вы можете скомпилировать ваш драйвер устройства PCI в ядро ​​(то есть не связанное как модуль), вы можете попробовать выделить память во время загрузки. Это должно позволить вам обходить верхние границы динамических распределений. Обратитесь к драйверам устройств Linux, изд. 3 ч. 8 для деталей.

Ответ 2

CMA (Смежный Memory Allocator) - лучшее решение для вашей ИМО. Вам просто нужно отправить новое ядро.