/*分配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; }
Linux内存管理之slab机制(创建slab)
内容版权声明:除非注明,否则皆为本站原创文章。