分配内存

版权声明:转载请声明 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);/*销毁一个结构体*/

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/83448924