用于多个进程的内核驱动程序中的内存池

时间:2015-04-27 12:18:05

标签: memory-management linux-kernel linux-device-driver kernel-module 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++; 
    } 

此外,我在每个进程的私有设备结构中维护一个缓冲区。

如何将池中的一些内存分配给此缓冲区。

1 个答案:

答案 0 :(得分:4)

要创建内存池,您需要使用

  1. 内核的slab分配器

  2. 你自己维护内存池就像你做的那样(kmalloc)

  3. 通过使用内核的slab分配器,您可以使用:

    1. kmem_cache_create()/ kmem_cache_create()。
      1. mempool_create()
      2. 我认为你自己维护池的关键问题是存在创建内存碎片问题的风险,这会很快耗尽内存,或者即使有很多内存块也无法分配大内存块自由记忆。

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