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