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,会出现如图所示的结果。
执行命令rmmod mempool_create.ko卸载模块,执行命令dmesg -c,会出现如图所示的结果。
结果分析:
在该测试程序中,首先调用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缓存,参考极客笔记关于这两个函数的分析。