多进程内核驱动程序中的内存池
Pool of Memory in Kernel driver for Multiple processes
假设我们要在设备驱动程序或模块中维护一个内存池。如何创建该池并使其可供多个进程使用,假设有 4 个进程访问此 driver/module。
假设池中有 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_cache_create()
mempool_create()
我认为你自己维护一个池的关键问题是有可能产生内存碎片问题,这会很快 运行 耗尽你的内存,或者你不能分配一个大的内存块,即使有很多空闲内存。
使用 内核的 slab 分配器 的另一个好处是您可以通过查看 /proc/slab
条目轻松监控内存使用情况。
假设我们要在设备驱动程序或模块中维护一个内存池。如何创建该池并使其可供多个进程使用,假设有 4 个进程访问此 driver/module。
假设池中有 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_cache_create()
mempool_create()
我认为你自己维护一个池的关键问题是有可能产生内存碎片问题,这会很快 运行 耗尽你的内存,或者你不能分配一个大的内存块,即使有很多空闲内存。
使用 内核的 slab 分配器 的另一个好处是您可以通过查看 /proc/slab
条目轻松监控内存使用情况。