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