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

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

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

假设池中有 1 MB 内存。

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

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

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

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

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

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

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

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

最佳答案

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

  • kmem_cache_create()
  • mempool_create()

  • 我认为你自己维护一个池的关键问题是产生内存碎片问题的风险,这将很快耗尽你的内存,或者即使有很多可用内存,你也无法分配大的内存块。
    使用 的另一个好处内核的slab分配器您是否可以通过查看 /proc/slab 轻松监控内存使用情况?条目。

    关于memory-management - 用于多个进程的内核驱动程序中的内存池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29895547/

    相关文章:

    c++ - 使用多个堆进行内存管理有什么好处吗?

    c++ - 释放数组的不同方法 - C++

    linux - 如何从内核空间检查/验证用户空间中 .so 或 exe 的可用性

    linux - hrtimer 即使未启动也会运行

    linux - 什么是真正的 pte(与 NUMA 中的迁移 pte 相对)

    c++ - 英特尔 MKL 内存管理和异常

    cocoa - NSUndoManager 是否保留其参数?

    c - 文件描述符中实际存储了多少信息?

    linux - 为什么memory NX在Linux内核中需要硬件支持?

    android - 内核开发新手 : "Virtual" input driver in kernel?