Linux内核API mempool_alloc_slab

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,会出现如图所示的结果。

Linux内核API mempool_alloc_slab

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

Linux内核API mempool_alloc_slab

结果分析:

由于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( ),参考极客笔记关于它们的分析。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程