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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Спасибо @kikigood за то, что потратили некоторое время на это. Поэтому, основываясь на ваших комментариях, я делаю что-то вроде этого.

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

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

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

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

1 ответ

Решение

Для того, чтобы создать пул памяти, вам необходимо использовать

  1. распределитель плиты ядра

    или же

  2. вы поддерживаете пул памяти самостоятельно, как то, что вы делали (kmalloc)

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

  1. kmem_cache_create () / kmem_cache_create ().

или же

  1. mempool_create()

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

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

Другие вопросы по тегам