Linux内核模块实现内存池(mempool_t)

一、编程接口

(1)kmem_cache_create():创建内存缓存。

(2)mempool_create():创建内存池。

(3)mempool_destroy():释放内存池。

(4)kmem_cache_destroy():释放内存缓存。

(5)函数 mempool_alloc(mempool_t *pool,gfp_t gfp_mask) 功能:直接从内存池当中分配一个内存元素。

void *p = mempool_alloc(pool,GFP_KERNEL);

(6)函数 page_address() 功能:获取物理页的逻辑地址。

二、mempool_t数据结构

typedef struct mempool_s {
    
    
	spinlock_t lock;
	int min_nr;		/* nr of elements at *elements */
	int curr_nr;		/* Current nr of elements at *elements */
	void **elements;//保留元素的指针数组

	void *pool_data;//相关私有数据
	mempool_alloc_t *alloc;
	mempool_free_t *free;
	wait_queue_head_t wait;//内存池为空时的等待队列
} mempool_t;

通过自旋锁保护对象字段。

三、代码示例

步骤:

  1. 定义初始化模块和退出模块函数。
  2. 定义kmem_cache、mempool_t全局变量。
  3. 在初始化模块函数调用kmem_cache_create和mempool_create函数,创建内存池。
  4. 退出模块调用mempool_destroy和kmem_cache_destroy释放内存。
  5. 模块初始化操作和退出函数调用module_init()和module_exit()。
  6. 其他的声明信息,比如许可协议、作者、模块功能描述等等。
/* 头文件和全局变量地声明*/
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/mempool.h>
#include <linux/blkdev.h>

static int __init mempool_create_InitFunc(void);
static void __exit mempool_create_ExitFunc(void);

struct kmem_cache *pmycache = NULL;
static mempool_t *mypool=NULL;
#define MEMSIZE 10240

// 模块初始化函数
int __init mempool_create_InitFunc(void)
{
    
    
    pmycache = kmem_cache_create("MyselfCache",10240,0, SLAB_HWCACHE_ALIGN, NULL);
    if(NULL==pmycache)
    {
    
    
        printk("执行:kmem_cache_create(...)函数失败,请重新检查?\n");
    }        
    else
    {
    
    
        printk("创建slab缓存成功!\n");
        printk("MyselfCache Cache大小为: %d\n", kmem_cache_size(pmycache));

        // 基于slab缓存创建6个初始元素的内存池
        mypool=mempool_create(6, mempool_alloc_slab, mempool_free_slab, pmycache);
        if(NULL == mypool)
        {
    
    
            printk("执行:mempool_create()函数失败,请重新检查?\n");
            return 0;
        }
        else
        {
    
    
            printk("创建内存池成功!\n");
            printk("内存池中元素最大个数,min_nr = %d\n", mypool->min_nr);
        }
    }
    return 0;
}

// 模块退出函数
void __exit mempool_create_ExitFunc(void)
{
    
    
    // 释放内存池
    if(NULL != mypool)
    {
    
    
        mempool_destroy(mypool);
        printk("执行:mempool_destroy()函数释放内存池成功!\n");
    }

    // 释放slab缓存
    if(NULL != pmycache)
    {
    
    
        kmem_cache_destroy(pmycache);
        printk("执行:kmem_cache_destroy()函数释放slab缓存成功!\n");
    }
    printk("内核模块退出成功!\n");
}

/* 模块初始化操作和退出函数调用 */
module_init(mempool_create_InitFunc);
module_exit(mempool_create_ExitFunc);

MODULE_LICENSE("GPL"); /* 描述模块代码接受的软件许可协议 */
MODULE_AUTHOR("Lion Long"); /* 描述模块的作者信息:包括作者姓名及邮箱等等 */
MODULE_DESCRIPTION(" kernel module : mempool_create/mempool_destroy"); /* 简要描述此模块用途及功能介绍*/

Makefile

obj-m:=mc.o	

CURRENT_PAHT:=$(shell pwd) 
LINUX_KERNEL:=$(shell uname -r)   

LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
all:

	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PAHT) modules

clean:

	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PAHT) cleals

小结

实际使用中可根据具体场景进行内存池创建和使用,内存池的使用调用mempool_alloc函数。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Long_xu/article/details/129863074