Memory management 多进程内核驱动程序中的内存池

Memory management 多进程内核驱动程序中的内存池,memory-management,linux-kernel,linux-device-driver,kernel-module,kmalloc,Memory Management,Linux Kernel,Linux Device Driver,Kernel Module,Kmalloc,假设我们想要在设备驱动程序或模块中维护一个内存池。如何创建该池并使其可用于多个进程,例如4个进程,访问此驱动程序/模块 假设池中有1 MB内存 在阅读LDD时,我遇到了api的mempool_create(),但还有kmalloc 如果有人做过这样的事,请分享知识 我最初的方法是使用kmalloc()进行分配,然后在私有对象中为打开模块的每个进程维护开始和结束指针 编辑:感谢@kikigood在这方面花费了一些时间。所以根据你的评论,我做了这样的事情 假设我在初始化期间分配了1MB的内存池。 我

假设我们想要在设备驱动程序或模块中维护一个内存池。如何创建该池并使其可用于多个进程,例如4个进程,访问此驱动程序/模块

假设池中有1 MB内存

在阅读LDD时,我遇到了api的mempool_create(),但还有kmalloc

如果有人做过这样的事,请分享知识

我最初的方法是使用kmalloc()进行分配,然后在私有对象中为打开模块的每个进程维护开始和结束指针

编辑:感谢@kikigood在这方面花费了一些时间。所以根据你的评论,我做了这样的事情

假设我在初始化期间分配了1MB的内存池。 我想把进程数限制为4,所以我保留一个计数。 每次递增此计数

atomic_t count =0;
    open()
    { 
        if(count >4) 
            return -ENOMEM;
        count++; 
    } 
此外,我在每个进程的专用设备结构中维护一个缓冲区


如何将一些内存从池分配到此缓冲区。

为了创建内存池,您需要使用内核的slab分配器,或者像以前那样自己维护内存池(
kmalloc
)。通过使用内核的slab分配器,您可以使用以下其中之一:

  • kmem\u cache\u create()

  • mempool\u create()

我认为,您自己维护一个池的关键问题是可能会产生内存碎片问题,这将很快耗尽您的内存,或者即使有大量可用内存,您也无法分配大内存块


使用内核的slab分配器的另一个好处是,您可以通过查看
/proc/slab
条目轻松监控内存使用情况。

如何使用mempool\u create()或kmem\u cache\u create()管理进程之间的内存分配。我可以在模块的init()期间使用这些API…在open()中为每个进程使用什么。您可以在模块init中执行kmem_cache_create(),并将其返回值(句柄)传递给open方法。与以下代码类似:int scul_open(struct inode inode,struct file*filp){filp->private_data=dev;/for other methods*/}。因此,您可以简单地将句柄存储到您的dev结构中。但是,如果您在处理多个进程可以访问同一设备或不同虚拟设备的情况时询问如何实现设备驱动程序的方法,则这是另一回事,与如何使用内存池无关。通常,如果您的驱动程序需要支持来自不同进程的访问,并且需要将它们与驱动程序端区分开来,那么您可以在共享链接列表中为每个进程存储一个pid键(current->pid)。有关更多信息,请参阅“6.6.4.在open上克隆设备”