malloc в ядре - PullRequest
       35

malloc в ядре

9 голосов
/ 22 мая 2010

Когда я пытаюсь использовать malloc в модуле ядра, я получаю сообщение об ошибке от компилятора.Мой код:

res=(ListNode*)malloc(sizeof(ListNode));

Сообщение об ошибке компилятора:

/root/ex3/ex3mod.c:491: error: implicit declaration of function ‘malloc’

Что мне делать?

Ответы [ 6 ]

20 голосов
/ 22 мая 2010

используйте kmalloc или vmalloc (см. Также this )

15 голосов
/ 03 ноября 2011

Примечание о разнице между двумя методами распределения - kmalloc и kmem_cache или vmalloc:

kmalloc: лучше всего использовать для быстрых распределений, которые меньше, чем страница (PAGE_SIZE,0x1000 на большинстве архитектур).Это не связано с отображением памяти, поэтому вы получаете память прямо из отображения физической памяти ядра 1: 1.Вы получаете физически условную память.Обратите внимание, что если вы хотите выделить более чем одну страницу (т. Е. Порядок> 0), вы рискуете столкнуться с внешними проблемами фрагментации - то есть вызов может завершиться неудачей, даже если достаточно свободного места.Более высокий порядок - более высокая вероятность неудачного размещения, и здесь также учитывается время безотказной работы.

Если вы хотите достичь максимальной эффективности распределения, тогда используйте собственный kmem_cache для каждого типа структуры.(другие преимущества этой стратегии - возможность отслеживать состояние выделенных ресурсов из /proc и более легко обнаруживать утечки памяти).

vmalloc: выделения из более чем одной страницы.Вы получаете отображенную память в пространстве ядра.За кулисами это похоже на то, что получает пользовательское пространство - ядро ​​выделяет кучу страниц и отображает их в виртуальном адресном пространстве.Это распределение медленнее, чем kmalloc, и доступ к памяти может потребовать немного больше ресурсов.

7 голосов
/ 23 мая 2010

Вы не можете использовать библиотеки в ядре. Ничего подобного.

Это означает, что ЛЮБУЮ функцию, которую вы вызываете в ядре, нужно определить в ядре. Linux не определяет malloc, поэтому вы не можете его использовать.

Существует распределитель памяти и семейство функций выделения памяти. Прочитайте документы ядра на распределителе памяти для получения дополнительной информации.

Кстати, есть несколько функций, которые определяет ядро, которые также есть в стандартной C-библиотеке; это для удобства.

Например, определено snprintf

1 голос
/ 16 августа 2011

используйте kmalloc / kfree.Вы можете grep malloc в исходном коде ядра.

0 голосов
/ 23 апреля 2014

Вы можете представить это как трехэтапный процесс:

  1. Библиотека пространства пользователя - malloc ()

  2. Системный вызов - brk ()

  3. Внутри ядра - процедуры менеджера памяти kmalloc / vmalloc / gfp и т.д.

Итак, если вы уже находитесь на шаге 3, пишите модуль ядра, тогда возвращаться назад не имеет смысла. Поэтому вам нужно использовать подпрограммы ядра только для выделения памяти.

0 голосов
/ 28 декабря 2012

Действительно, вы должны использовать kmalloc и друзей, посмотрите примеры для ядра Linux. например.: http://lxr.linux.no/linux+v3.0/drivers/infiniband/hw/mthca/mthca_provider.c#L1033

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...