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