【问题标题】:Pool of Memory in Kernel driver for Multiple processes用于多个进程的内核驱动程序中的内存池
【发布时间】:2015-07-05 21:28:18
【问题描述】:

假设我们想在设备驱动程序或模块中维护一个内存池。如何创建该池并使其可供多个进程使用,比如说 4 个进程,访问此驱动程序/模块。

假设池中有 1 MB 内存。

当我阅读 LDD 时,我遇到了 api 的 mempool_create(),但是还有 kmalloc。

如果有人做过这样的事情,请分享知识。

我最初的方法是使用 kmalloc() 进行分配,然后为打开模块的每个进程在私有对象中维护开始和结束指针。

编辑:感谢@kikigood 花一些时间在这上面。所以根据你的cmets,我做这样的事情。

假设我在初始化期间分配了 1MB 的内存池。 我想将进程数限制为 4,所以我记下了。 每增加一次这个计数

atomic_t count =0;
    open()
    { 
        if(count >4) 
            return -ENOMEM;
        count++; 
    } 

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

如何从池中分配一些内存给这个缓冲区。

【问题讨论】:

    标签: memory-management linux-kernel linux-device-driver kernel-module kmalloc


    【解决方案1】:

    为了创建内存池,您需要使用内核的slab分配器,或者像您所做的那样自己维护内存池(kmalloc)。通过使用内核的slab分配器,您可以使用其中之一:

    • kmem_cache_create()

    • mempool_create()

    我认为你自己维护一个池的关键问题是产生内存碎片问题的风险,这将很快耗尽你的内存,或者即使有很多可用内存也无法分配大内存块.

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

    【讨论】:

    • 如何使用 mempool_create() 或 kmem_cache_create() 管理进程之间的内存分配。我可以在模块的 init() 期间使用的那些 API...在每个进程的 open() 中使用什么。
    • 您可以在模块 init 中执行 kmem_cache_create() 并将其返回值(句柄)传递给 open 方法。像下面的代码: int scull_open(struct inode inode, struct file *filp){ filp->private_data = dev; / 对于其他方法 */ }。因此您可以简单地将句柄存储到您的开发结构中。
    • 但是如果你在处理多个进程可以访问同一个设备或不同虚拟设备的情况下如何实现设备驱动程序的方法,那是另一回事,与如何使用内存无关游泳池。
    • 通常情况下,如果你的驱动需要支持不同进程的访问,并且你需要和驱动端区分开来,那么你可以为每个进程存储一个pid key(current->pid)到一个shared中链接列表。更多信息,您可以参考makelinux.net/ldd3/chp-6-sect-6“6.6.4. 在打开时克隆设备”
    猜你喜欢
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多