llinux C缓存的分配和使用方法

llinux C缓存的分配和使用方法
        这几天做 C socket 有个朋友遇到问题,答应帮忙解决的,于是上网
找找相关资料,可惜实在是难找,郁闷上图书馆翻翻书,发现一本叫
《linux内核分析及编程》--倪继利 的书讲到了,呵呵happy;借回来looklook;
顺便把要用到的内容打出来发个文章,有需要的朋友可以看看;改资料虽然
简短,但我想会很有用;linux 下的C编程系统源码有着密切的关系,我想这
是编程的难度所在本来寒假是想学点C的,不知道这么搞的搞到java那里去了
看来还是要花点时间学学C了,不然就完了;
呵呵,全是废话来的,看资料吧!



linux下用C实现缓存分配和使用


kmem_cache_create 函数是给一个对象空间分配一个缓冲区,下面是它的例子(在kernel/fork.c中)


void  _init proc_caches_init( void ) {
 
 vm_area_cachep 
= kmem_cache_create(
             
"vm_area_struct",
             
sizeof(vm_area_struct),
             SLAB_PANIC,NULL,NULL
               );
 
 }


kmem_cache_alloc 是从指定的缓冲区中分配一个对象,它的例子如下:


static  inline  int  dup_mmap( struct  mm_struct  *  mm, struct  mm_struct  * oldmm) {
struct vm_area_struct *mpnt,*tmp,**pprev;
.
   tmp 
= kmem_cache_alloc(vm_area_cachep,
                         SLAB_KERNAEL
                       );
.
}


kmalloc 函数是分析一个大小为 size 的内存块,下面是一个应用例子(在kernel/power/pm.c)



struct  pm_dev  * pm_register(pm_dev_t type,
                  unsigned 
long  id,
                  pm_callback callback   
                  )
{
    
//GEP_KERNEL表示正在运行的内核态的进程分配空间,可以陷入睡眠
struct pm_dev *dev = kmalloc (sizeof(struct pm_pev),GFP_KERNEL);
..
}


vmalloc 函数分配一段连续的 size 大小的虚拟内存,其对应物理页可不连续。下面是一个应用例
子(在security/selinux/ss/avtab.c中):



int  avtab_init( struct  avtab  * h)
    
{
      ..
      h
->htable = vmalloc(sizeof(*(h->htable))*AVTAB_SIZE);
      ..
       }





地震让大伙知道:居安思危,才是生存之道。

你可能感兴趣的:(llinux C缓存的分配和使用方法)