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