kmem_cache 内核slab内存管理

126 阅读2分钟

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*));

参数说明

  1. name:

    • 类型: const char *
    • 描述: 缓存的名称,用于调试和标识。
  2. size:

    • 类型: size_t
    • 描述: 缓存中每个对象的大小。
  3. align:

    • 类型: size_t
    • 描述: 对象的对齐方式。通常设置为 0,表示使用默认对齐方式。
  4. flags:

    • 类型: unsigned long
    • 描述: 缓存的标志位,用于指定缓存的行为。常见的标志位包括:
      • SLAB_HWCACHE_ALIGN: 对齐到硬件缓存行。
      • SLAB_CACHE_DMA: 用于 DMA 操作。
      • SLAB_PANIC: 如果创建失败,触发内核 panic。
      • SLAB_RECLAIM_ACCOUNT: 将缓存计入可回收内存。
  5. 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);

注意事项

  1. 内存管理: 使用 kmem_cache_create 创建的缓存需要在不再使用时通过 kmem_cache_destroy 销毁,以释放相关资源。
  2. 性能: slab 缓存适用于频繁分配和释放小对象的场景,可以显著提高内存管理的性能。
  3. 对齐: 对齐方式会影响缓存的性能,选择合适的对齐方式可以减少内存浪费。

通过使用 kmem_cache_create,可以有效地管理内核中的小对象内存,提高系统的整体性能。