linux内核申请空间方法总结

内核 内存申请与释放

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

你可能感兴趣的:(linux内核申请空间方法总结)