Linux内核API mempool_create

mempool_create函数功能描述:mempool_create( )函数的功能是创建一个新的内存池。

mempool_create文件包含

#include<linux/mempool.h>

mempool_create函数定义

在内核源码中的位置:linux-3.19.3/mm/mempool.c

函数定义格式:

mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data)

mempool_create输入参数说明

  • min_nr:为内存池分配的最小内存成员数量。
  • alloc_fn:用户自定义内存分配函数。
  • free_fn:用户自定义内存释放函数。
  • pool_data:根据用户自定义内存分配函数所提供的可选私有数据,一般是缓存区指针。

mempool_create返回参数说明

mempool_create( )函数如果创建新的内存池成功,则返回内存池对象的指针,否则返回空。

其中内存池描述符mempool_t在文件linux-3.19.3/include/linux/mempool.h中定义:

typedef struct mempool_s {
    spinlock_t lock;              //用来保护对象字段的自旋锁
    int min_nr;                   //内存池中元素的最大个数
    int curr_nr;                  //当前内存池中元素的个数
    void **elements;            //指向一个数组的指针,该数组由指向保留元素的指针组成

    void *pool_data;             //池的拥有者可获得的私有数据
    mempool_alloc_t *alloc;      //分配一个元素的方法
    mempool_free_t *free;        //释放一个元素的方法
    wait_queue_head_t wait;       //当内存池为空时使用的等待队列
} mempool_t;

mempool_create实例解析

编写测试文件:mempool_create.c

头文件及全局变量声明如下:

#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/mempool.h>
#include <linux/blkdev.h>
#include <linux/writeback.h>
MODULE_LICENSE("GPL");
static int __init mempool_create_init(void);
static void __exit mempool_create_exit(void);

static struct kmem_cache * kmem;
static mempool_t * pool = NULL;

模块初始化函数:

int __init mempool_create_init(void)
{
    // 创建一个名为"my_buffer"的slab缓存
    kmem = kmem_cache_create("my_buffer",10000,0, SLAB_HWCACHE_ALIGN, NULL);

    if(kmem == NULL )
    {
        printk("kmem_cache_create failed! \n");
        return 0;
    }
    else
    {
        printk("kmem_cache_create successfully! \n");

        // 基于创建的slab缓存创建一个包含5个初始元素的内存池
        pool = mempool_create(5, mempool_alloc_slab, mempool_free_slab, kmem);
        if(pool == NULL )
        {
            printk("mempool_create failed! \n");
            return 0;
        }
        else
        {
            printk("mempool_create successfully! min_nr = %d\n", pool->min_nr);
        }
    }
    return 0;
}

模块退出函数:

void __exit mempool_create_exit(void)
{
    if(pool ! = NULL)
    {
        mempool_destroy(pool);        //销毁创建的内存池
        printk("mempool_destroy succeed! \n");
    }
    if(kmem ! = NULL)
    {
        kmem_cache_destroy(kmem);     //销毁创建的slab缓存
        printk("kmem_cache_destroy succeed! \n");
    }
    printk("exit! \n");
}

模块初始化及退出函数调用:

module_init(mempool_create_init);
module_exit(mempool_create_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod mempool_create.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。

Linux内核API mempool_create

执行命令rmmod mempool_create.ko卸载模块,执行命令dmesg -c,会出现如图所示的结果。

Linux内核API mempool_create

结果分析:

在该测试程序中,首先调用kmem_cache_create( )函数从系统缓存区cache_cache中获取长度为10000字节的缓存区大小的内存,作为my_cache使用的缓存区,然后基于该slab缓存创建一个内存池(slab缓存的创建的实现函数kmem_cache_create( )参考该函数的分析)。mempool_create( )函数是内存池创建函数,这里假设创建的内存池初始由5个元素,内存分配函数和释放函数分配选择mempool_alloc_slab( )和mempool_free_slab( ),调用该函数后由输出结果可知创建内存池成功,其返回的内存池描述符mempool_t的min_nr字段的值也是5。

最后模块退出时调用mempool_destroy( )销毁新创建的内存池,并且由kmem_cache_destroy( )销毁创建的slab缓存,参考极客笔记关于这两个函数的分析。

赞(0)
未经允许不得转载:极客笔记 » Linux内核API mempool_create
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址