Невозможно получить память, выделенную из `flex_array_alloc` при запросе относительно большого размера в ядре Linux - PullRequest
0 голосов
/ 20 ноября 2018

Я занимаюсь разработкой ядра Linux.

И я собираюсь выделить некоторое пространство памяти с чем-то вроде:

ptr = flex_array_alloc(size=136B, num=1<<16, GFP_KERNEL)

И ptr Оказывается NULL каждый раз, когда я пытаюсь.

Более того, когда я изменяю размер на 20B или num на 256 , нет ничего плохого, и память может быть получена.

Поэтому я хочу знать, есть ли какие-то ограничения для запроса памяти в модулях ядра Linux.И как его отладить или выделить большой объем памяти.

Спасибо.


И kzalloc ведет себя аналогично в моей среде.То есть, запрос 136B * (1<<16) пробела не удался, в то время как 20B или 1<<8 завершился успешно.

1 Ответ

0 голосов
/ 20 ноября 2018

Существует два ограничения на размер массива, выделенного с помощью flex_array_allocate.Во-первых, сам размер объекта не должен превышать одну страницу, как указано в https://www.kernel.org/doc/Documentation/flexible-arrays.txt:

Недостатком является то, что массивы не могут быть проиндексированы напрямую, размер отдельного объекта не может превышать размер системной страницы,а для помещения данных в гибкий массив требуется операция копирования.

Во-вторых, максимальное количество элементов в массиве.

Оба ограничения являются результатом метода реализации:

… потребность в памяти из vmalloc() может быть устранена путем объединения массива из более мелких частей ...

Гибкий массив содержит произвольное (в определенных пределах) число фиксированныхобъекты с размером, доступ к которым осуществляется через целочисленный индекс.… Выполняются только одностраничные выделения

Массив «соединяется» вместе с помощью массива указателей на отдельные части,где каждая часть - одна системная страница.Поскольку этот массив также распределен, и выполняются только одностраничные выделения (как отмечено выше), максимальное количество частей немного меньше числа указателей, которые могут поместиться на странице (немного меньше, потому что есть также некоторые бухгалтерские данные.) По сути, это ограничивает общий размер гибкого массива до 2 МБ в системах с 8-байтовыми указателями и страницами по 4 КБ.(Точное ограничение будет варьироваться в зависимости от количества потерянного пространства на странице, если размер объекта не является степенью двойки.)

...