Roo*_*nix 10 memory-management kernel-module linux-device-driver linux-kernel kmalloc
假设我们想要在设备驱动程序或模块中维护一个内存池.如何创建该池并使其可用于多个进程,可以说4个进程,访问此驱动程序/模块.
假设池中有1 MB内存.
当我读LDD时,我遇到了api的mempool_create(),但之后还有kmalloc.
如果有人做了这样的事情,请分享知识.
我最初的方法是使用kmalloc()进行分配,然后为打开模块的每个进程维护私有对象中的开始和结束指针.
编辑:谢谢@kikigood花了一些时间在这上面.所以基于你的评论,我做了这样的事情.
假设我在初始化期间分配了1MB的mempool.我想将进程数限制为4,所以我保持计数.每次都增加这个数量
atomic_t count =0;
open()
{
if(count >4)
return -ENOMEM;
count++;
}
Run Code Online (Sandbox Code Playgroud)
我还在每个进程的私有设备结构中维护一个缓冲区.
如何将池中的某些内存分配给此缓冲区.
小智 5
为了创建内存池,你需要使用内核的slab分配器,或者像你所做的那样自己维护内存池(kmalloc)。通过使用内核的平板分配器,您可以使用其中之一:
kmem_cache_create()
mempool_create()
我认为你自己维护一个池的关键问题是存在创建内存碎片问题的风险,这会很快耗尽你的内存,或者即使有很多空闲内存你也无法分配大内存块。
使用内核的slab 分配器的另一个好处是您可以通过查看您的/proc/slab条目轻松监控内存使用情况。