版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/83448924
1 kmalloc()
static __always_inline void *kmalloc(size_t size, gfp_t flags)
falgs:
2 vmalloc()
void *vmalloc(unsigned long size)
可以分配到很大的的虚拟内存,但是不是连续的内存
void vfree(const void *addr)
{
kfree(addr);
}
3 后备高速缓存(内存池)
在驱动程序中,会经常反复地分配很多同一大小的内存块,也会频繁的将这些内存块给释放掉。如果频繁的申请和释放内存,很容易产生内存碎片,使用内存池很好地解决了这个问题。在Linux中,为一些反复分配和释放的结构体预留了一些内存空间,使用内存也来管理,管理这种内存池的技术叫做slab分配器。这种内存叫做后备高速缓存。
struct kmem_cache {
unsigned int size, align;
unsigned long flags;
const char *name;
void (*ctor)(void *);
};
创建:
struct kmem_cache *kmem_cache_create(const char *name, size_t size,
size_t align, unsigned long flags, void (*ctor)(void *))
该函数创建一个新的后备告诉缓存对象,这个缓冲区中可以容纳指定个数的内存块。
内存块的数目由参数size来指定。
参数name表示该后备高速缓存对象的名字,以后可以使用name来表示使用哪个后备高速缓存。
第3个参数align是后备高速缓存中第一个对象的偏移值,这个值一般情况下被置为0。
第4个参数flage是一个位掩码,表示控制如何完成分配工作。
第5个参数ctor是一个可选的函数,用来对加入后备告诉缓存中的内存块进行初始化。
分配slab缓存函数
void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
释放:
void kmem_cache_free(struct kmem_cache *cachep, void *objp)
销毁缓存池
void kmem_cache_destroy(struct kmem_cache *c)
实例代码:
用来为线程结构体分配一点内存
/*以下两行创建slab缓存*/
static struct kmem_cache *thread info cache;/*声明一个struct kmem_cache的指针*/
thread_info_cache = kmem_cache_create ("thread info", THREAD SIZE,THREAD SIZE, o, NULL);/*创建一个后备高速缓存区*/
/*以下两行分配slab缓存*/
struct thread_info *ti;/*线程结构体指针*/
ti = kmem_cache_alloc (thread_info_cache, GFP_KERNEL); /*分配一个结构体*/
/*省略了使用slab缓存的函数 ....../
/*以下两行释放slab缓存*/
kmem_cache_free (thread info cache, ti);/*释放一个结构体*/
kmem_cache_destroy (thread_info_cache);/*销毁一个结构体*/