Выделение более 4 МБ закрепленной непрерывной памяти в ядре Linux - PullRequest
19 голосов
/ 09 мая 2011

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

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

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

Спасибо.

Ответы [ 2 ]

9 голосов
/ 09 мая 2011

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

2 голосов
/ 14 июля 2012

CMA (непрерывный распределитель памяти) - лучшее решение для ваших нужд IMO.Вам просто нужно отправить новое ядро.

...