10

Supponiamo di voler mantenere un pool di memoria in un driver di periferica o modulo. Come si può creare quel pool e renderlo disponibile a più processi, diciamo 4 processi, accedendo a questo driver/modulo.Pool di memoria nel driver Kernel per più processi

Assumere 1 MB di memoria nel pool.

Quando stavo leggendo LDD mi sono imbattuto in mempool_create() di api ma poi c'è anche kmalloc.

Se qualcuno ha fatto una cosa del genere, condividi la conoscenza.

Il mio approccio iniziale è quello di allocare utilizzando kmalloc() e quindi mantenere i puntatori di inizio e fine nell'oggetto privato per ogni processo che apre il modulo.

MODIFICA: Grazie a @kikigood per dedicare un po 'di tempo a questo. Quindi, in base ai tuoi commenti, faccio qualcosa del genere.

Diciamo che ho assegnato 1MB di mempool durante init. E voglio limitare il conteggio dei processi a 4, quindi tengo un conteggio. Incremento questo conteggio ad ogni

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

Anche io mantenere un buffer all'interno della mia struttura del dispositivo privato per processo.

Come assegnare memoria dal pool a questo buffer.

risposta

4

Al fine di creare un pool di memoria, è necessario utilizzare

  1. del kernel slab allocator

    o

  2. a mantenere il pool di memoria da soli, come quello che hai fatto (kmalloc)

Utilizzando l'allocatore di slab del kernel, è possibile utilizzare:

  1. kmem_cache_create()/kmem_cache_create().

o

  1. mempool_create()

Credo che il problema chiave per voi per mantenere una piscina da soli è un rischio di creare problema di frammentazione della memoria che esaurirà rapidamente la memoria o non è possibile allocare un blocco di memoria di grandi dimensioni anche se c'è molta memoria libera.

Un altro vantaggio dell'utilizzo di allocatore di slab del kernel è che è possibile monitorare facilmente l'utilizzo della memoria esaminando le voci/proc/slab.

+0

Come posso gestire la distribuzione della memoria tra i processi utilizzando mempool_create() o kmem_cache_create(). Quelle API che posso usare durante init() del modulo ... cosa usare in open() per ogni processo. – RootPhoenix

+0

Si può fare kmem_cache_create() nel modulo init e passare il suo valore di ritorno (handle) al metodo open.come il seguente codice: int scull_open (struct inode * inode, struct file * filp) {filp-> private_data = dev;/* per altri metodi * /}. in modo che tu possa semplicemente archiviare l'handle nella tua struttura di sviluppo. – kikigood

+0

ma se si chiede come implementare il metodo del driver di periferica mentre si gestiscono i casi in cui più processi possono accedere allo stesso dispositivo o a diversi dispositivi virtuali, è una cosa diversa che non è correlata all'utilizzo del pool di memoria. – kikigood