mempool_alloc_slab函数功能描述:内存池创建时需要有内存分配(alloc)和释放(free)函数,当内存元素是slab对象时,alloc和free方法一般由mempool_alloc_slab( )和mempool_free_slab( )函数实现,在这种情况下,mempool_t对象的pool_data字段存放了slab高速缓存描述符的地址。
因此mempool_alloc_slab( )的功能是内存池的一种基于slab对象时的分配器,它也是通常使用的内存池分配器。
mempool_alloc_slab文件包含
#include<linux/mempool.h>
mempool_alloc_slab函数定义
在内核源码中的位置:linux-3.19.3/mm/mempool.c
函数定义格式:
void *mempool_alloc_slab(gfp_t gfp_mask, void *pool_data)
mempool_alloc_slab输入参数说明
gfp_mask
:内存的分配标志,其常见取值及其含义参考 alloc_pages( ) 函数的分析。pool_data
:slab高速缓存描述符指针,参考kmem_cache_create( )函数的分析。
mempool_alloc_slab返回参数说明
该函数返回所分配的内存元素的起始地址。
mempool_alloc_slab实例解析
编写测试文件:mempool_alloc_slab.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_alloc_slab_init(void);
static void __exit mempool_alloc_slab_exit(void);
static struct kmem_cache * kmem = NULL;
void * element = NULL;
模块初始化函数:
int __init mempool_alloc_slab_init(void)
{
// 创建一个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");
element = mempool_alloc_slab( GFP_KERNEL , kmem ); //分配一个内存元素
printk("element = 0x%lx\n", (unsigned long)element); //输出起始地址
}
return 0;
}
模块退出函数:
void __exit mempool_alloc_slab_exit(void)
{
if(element)
{
mempool_free_slab(element, kmem); //释放内存元素空间
printk("mempool_free_slab successfully! \n");
}
if(kmem ! = NULL)
{
kmem_cache_destroy(kmem); //销毁slab高速缓存
printk("kmem_cache_destroy successfully! \n");
}
printk("exit! \n");
}
模块初始化及退出函数调用:
module_init(mempool_alloc_slab_init);
module_exit(mempool_alloc_slab_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod mempool_alloc_slab.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。
执行命令rmmod mempool_alloc_slab.ko卸载模块,执行命令dmesg -c,会出现如图所示的结果。
结果分析:
由于mempool_alloc_slab( )是内存池基于slab对象的一种分配器,所以这里首先创建一个名为”my_buffer”的slab高速缓存,然后将该缓存描述符kmem赋值给参数pool_data,选择常用的GFP_KERNEL分配标志,调用mempool_alloc_slab( )函数。由输出信息可知,所分配的内存元素的地址为element = 0xffff88013e518000。在模块退出时,为mempool_free_slab( )函数传递参数值element, kmem以释放分配的内存空间,最后再调用kmem_cache_destroy( )函数销毁slab高速缓存my_buffer。
测试程序中调用了函数kmem_cache_create( )、kmem_cache_destroy( )和mempool_free_slab( ),参考极客笔记关于它们的分析。