kmem_cache_create 是 Linux 内核中用于创建一个 slab 缓存的函数。slab 缓存是一种高效的内存管理机制,用于管理小对象的分配和释放。通过使用 slab 缓存,可以减少内存碎片并提高内存分配的性能。
函数原型
struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void*));
参数说明
-
name:- 类型:
const char * - 描述: 缓存的名称,用于调试和标识。
- 类型:
-
size:- 类型:
size_t - 描述: 缓存中每个对象的大小。
- 类型:
-
align:- 类型:
size_t - 描述: 对象的对齐方式。通常设置为 0,表示使用默认对齐方式。
- 类型:
-
flags:- 类型:
unsigned long - 描述: 缓存的标志位,用于指定缓存的行为。常见的标志位包括:
SLAB_HWCACHE_ALIGN: 对齐到硬件缓存行。SLAB_CACHE_DMA: 用于 DMA 操作。SLAB_PANIC: 如果创建失败,触发内核 panic。SLAB_RECLAIM_ACCOUNT: 将缓存计入可回收内存。
- 类型:
-
ctor:- 类型:
void (*ctor)(void*) - 描述: 构造函数,用于在分配对象时进行初始化。如果不需要初始化,可以传入
NULL。
- 类型:
返回值
- 成功: 返回指向新创建的
kmem_cache结构的指针。 - 失败: 返回
NULL。
示例代码
假设我们需要创建一个用于管理 128 字节对象的缓存,并且每个对象需要对齐到 64 字节,使用 SLAB_HWCACHE_ALIGN 标志,并且有一个初始化函数 my_ctor:
#include <linux/slab.h>
void my_ctor(void *obj) {
// 初始化对象
memset(obj, 0, 128);
}
struct kmem_cache *my_cache;
my_cache = kmem_cache_create("my_cache", 128, 64, SLAB_HWCACHE_ALIGN, my_ctor);
if (my_cache == NULL) {
// 处理创建失败的情况
printk(KERN_ERR "Failed to create kmem_cache\n");
return -ENOMEM;
}
// 使用缓存分配对象
void *obj = kmem_cache_alloc(my_cache, GFP_KERNEL);
if (obj == NULL) {
// 处理分配失败的情况
printk(KERN_ERR "Failed to allocate object\n");
return -ENOMEM;
}
// 使用对象
// ...
// 释放对象
kmem_cache_free(my_cache, obj);
// 销毁缓存
kmem_cache_destroy(my_cache);
注意事项
- 内存管理: 使用
kmem_cache_create创建的缓存需要在不再使用时通过kmem_cache_destroy销毁,以释放相关资源。 - 性能: slab 缓存适用于频繁分配和释放小对象的场景,可以显著提高内存管理的性能。
- 对齐: 对齐方式会影响缓存的性能,选择合适的对齐方式可以减少内存浪费。
通过使用 kmem_cache_create,可以有效地管理内核中的小对象内存,提高系统的整体性能。