Пул памяти в драйвере ядра для нескольких процессов

Предположим, что мы хотим поддерживать пул памяти в драйвере или модуле устройства. Как этот пул может быть создан и доступен для нескольких процессов, скажем, 4 процесса, обращаясь к этому драйверу/модулю.

Предположим, что в пуле установлено 1 МБ памяти.

Когда я читал LDD, я наткнулся на api mempool_create(), но затем там также kmalloc.

Если кто-то сделал такую ​​вещь, любезно поделитесь знаниями.

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

EDIT: Спасибо @kikigood за то, что потратили некоторое время на это. Поэтому, основываясь на ваших комментариях, я делаю что-то вроде этого.

Предположим, что я выделил 1 МБ памяти во время init. И я хочу ограничить количество процессов до 4, поэтому я сохраняю счет. Увеличьте это количество при каждом

atomic_t count =0;
    open()
    { 
        if(count >4) 
            return -ENOMEM;
        count++; 
    } 

Также я поддерживаю буфер внутри моей частной структуры устройства для каждого процесса.

Как назначить некоторую память из пула в этот буфер.

Ответ 1

Чтобы создать пул памяти, вам нужно использовать

  • распределитель slab ядра

    или

  • вы сами сохраняете пул памяти, как то, что вы сделали (kmalloc)

Используя распределитель slab ядра, вы можете использовать:

  • kmem_cache_create()/kmem_cache_create().

или

  1. mempool_create()

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

Еще одно преимущество использования распределителя slab ядра - вы можете легко контролировать использование памяти, просматривая записи/proc/slab.