本文共 1101 字,大约阅读时间需要 3 分钟。
slab系统对象利用lru可以找到kmem_cache
void kfree(const void *objp) struct kmem_cache *c; c = virt_to_cache(objp); =>struct kmem_cache *virt_to_cache(const void *obj) struct page *page = virt_to_head_page(obj); =>struct page *virt_to_head_page(const void *x) struct page *page = virt_to_page(x);//对象在页框之中 return compound_head(page); return page_get_cache(page); =>struct kmem_cache *page_get_cache(struct page *page) page = compound_head(page); return (struct kmem_cache *)page->lru.next;//可以参考slab数据结构图 __cache_free(c, (void *)objp);
伙伴系统利用lru组织链表
struct page *buffered_rmqueue(struct zone *preferred_zone, struct zone *zone, int order, gfp_t gfp_flags, int migratetype) page = __rmqueue(zone, order, migratetype); =>struct page *__rmqueue(struct zone *zone, unsigned int order, int migratetype) page = __rmqueue_smallest(zone, order, migratetype); =>struct page *__rmqueue_smallest(struct zone *zone, unsigned int order, int migratetype) page = list_entry(area->free_list[migratetype].next, struct page, lru);//只有第一个页加入到伙伴系统里面,第一个页被摘掉了,整个order都脱离了 list_del(&page->lru);
转载地址:http://wvlji.baihongyu.com/