1、申请内存的函数kmalloc(int sitze, int flag)
其中,flag有几种,
GFP_KERNEL(可能引起休眠)
GFP_USER(表示当前为用户态进程申请空间,可引起休眠)
GFP_ATOMIC(用在中断处理历程或其他运行于进程上下文之外的代码中分配内存,不会休眠)
GFP_NOFS,GFP_NOIO(分别表示在分配过程中不允许执行文件系统调用和IO)
用法:
p=kmalloc(100,GFP_KERNEL);
kfree(p);
说明:kmalloc申请的空间,有最大值限制,一般,为了程序的兼容性,不要超过128KB。如果超过128KB,可以采用get_free_page的方法获取内存
2、采用后被高速缓存办法
kmem_cache_create(char *name ,size_t size,size_t offset,unsigned long flags,void(*constructor)(***),void(*destructor)(***));
size:存储区域的大小,为一个固定的值
offset:页面中第一个对象的偏移量,用来确保对已分配的对象进行某种特殊的对齐,常用之为0
flag:常用值为SLAB_NO_HEAP(保护高速缓存在系统寻找内存的时候不会被减少。设置该标志通常不是个好主意)
SLAB_HWCACHE_ALIGN,要求所有数据对象跟高速缓存行对齐,可能会浪费一些空间
SLAB_CACHE_DMA,要求每个数据对象都从以用于DMA的内存区段中分配
用法:
kmem_cache_t *cache;
cache = kmem_cache_create("tmp",sizeof(struct XXX),0,SLAB_HWCACHE_ALIGN,NULL,NULL);
p=kmem_cache_alloc(cache,GFP_KERNEL);
kmem_cache_free(cache,p);
kmem_cache_destroy(cache);
3、内存池的方式
内核中有的地方内存分配是不允许失败的。为了确保这种情况下的成功分配,内核开发者建立了一种叫做内存池的抽象。
mempool_t *mempool_create(int min_nr,mempool_alloc_t *alloc_fn,
mempool_alloc_t *free_fn,void* pool_data
);
其中:
min_nr参数表示的是内存池应始终保持的已分配对象的最少数目
alloc_fn,free_fn:实际的申请与释放有这两个函数进行。
原型为 void*(mempool_alloc_t)(int gfp_mask,void*pool_data);
void (mempool_free_t)(void *elemet,void* pool_data);
pool_data为kmem_cache_t指针对象
用法:
cache= kmem_cache_craete(.....);
pool = mempool_create(20,mempool_alloc_slab,mempool_free_slab,cache);
p=mempool_alloc(pool,GFP_KERNEL);
mempool_free(p,pool);
mempool_destroy(pool);
kmem_cache_destroy(cache);
4、申请整个数据页,用get_free_page()函数
get_zeroed_page(unsigned int flags);
返回指向新页面的指针并将页面清零。
__get_free_page
(unsigned int flags);
与上一个相同,只是不清零页面
__get_free_page
(unsigned int flags,unsigned int order);
分配若干连续的页面,返回第一个字节的指针
其中,flags与kmalloc中的相同
order 是要申请和释放页面数目的以2为底的对数。order最大值为11或12。
释放:
void free_page(unsigned long addr);
void free_page(unsigned long addr,unsigned long order);