Linux内存管理之slab机制(创建slab)

/*分配slab管理对象*/   static struct slab *alloc_slabmgmt(struct kmem_cache *cachep, void *objp,                      int colour_off, gfp_t local_flags,                      int nodeid)   {       struct slab *slabp;          if (OFF_SLAB(cachep)) {           /* Slab management obj is off-slab. */           /* 外置式slab。从general slab cache中分配一个管理对象,          slabp_cache指向保存有struct slab对象的general slab cache。          slab初始化阶段general slab cache可能还未创建,slabp_cache指针为空          ,故初始化阶段创建的slab均为内置式slab。*/           slabp = kmem_cache_alloc_node(cachep->slabp_cache,                             local_flags, nodeid);           /*           * If the first object in the slab is leaked (it's allocated           * but no one has a reference to it), we want to make sure           * kmemleak does not treat the ->s_mem pointer as a reference           * to the object. Otherwise we will not report the leak.           *//* 对第一个对象做检查 */           kmemleak_scan_area(slabp, offsetof(struct slab, list),                      sizeof(struct list_head), local_flags);           if (!slabp)               return NULL;       } else {/* 内置式slab。objp为slab首页面的虚拟地址,加上着色偏移      ,得到slab管理对象的虚拟地址 */           slabp = objp + colour_off;           /* 计算slab中第一个对象的页内偏移,slab_size保存slab管理对象的大小          ,包含struct slab对象和kmem_bufctl_t数组 */           colour_off += cachep->slab_size;       } /* 在用(已分配)对象数为0 */       slabp->inuse = 0;       /* 第一个对象的页内偏移,可见对于内置式slab,colouroff成员不仅包括着色区      ,还包括管理对象占用的空间      ,外置式slab,colouroff成员只包括着色区。*/       slabp->colouroff = colour_off;       /* 第一个对象的虚拟地址 */       slabp->s_mem = objp + colour_off;       /* 内存节点ID */       slabp->nodeid = nodeid;       /* 第一个空闲对象索引为0,即kmem_bufctl_t数组的第一个元素 */       slabp->free = 0;       return slabp;   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22822.html