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文件包含
mempool_alloc_slab函数定义
在内核源码中的位置:linux-3.19.3/mm/mempool.c
函数定义格式:
mempool_alloc_slab输入参数说明
gfp_mask
:内存的分配标志,其常见取值及其含义参考 alloc_pages( ) 函数的分析。pool_data
:slab高速缓存描述符指针,参考kmem_cache_create( )函数的分析。
mempool_alloc_slab返回参数说明
该函数返回所分配的内存元素的起始地址。
mempool_alloc_slab实例解析
编写测试文件:mempool_alloc_slab.c
头文件及全局变量声明如下:
模块初始化函数:
模块退出函数:
模块初始化及退出函数调用:
实例运行结果及分析:
首先编译模块,执行命令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( ),参考极客笔记关于它们的分析。