基本知识:
在内核 编程中,可能经常会有一些数据结构需要反复使用和释放,按照通常的思路,可能是使用kmalloc和kfree来实现。
但是这种方式效率不高,Linux为我们提供了更加高效的方法——Slab高速缓存管理器。
动态创建固定大小的内存对象,虽然kmalloc的时间复杂度并不大,但是联系到空间复杂度,还是采用kmem_cache_alloc的好;而非固定大小的内存申请,只能经由kmalloc来解决。
xfrm_input.c中关于kmem_cache_alloc的代码:(按文件中代码的顺序)
先是声明了一个struct kmem_cache类型的结构体:
static struct kmem_cache *secpath_cachep __read_mostly;
接下来是释放操作函数:
void __secpath_destroy(struct sec_path *sp)
{
int i;
for (i = 0; i < sp->len; i++)
xfrm_state_put(sp->xvec[i]);
kmem_cache_free(secpath_cachep, sp);
}
EXPORT_SYMBOL(__secpath_destroy);
使用kmem_cache_alloc为一个struct sec_path结构体分配空间:
struct sec_path *secpath_dup