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.
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
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
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