page类 page对象指向( 二 )


比如high为4,而low为2 。那么第一遍历时,将大小为16(分配阶为4)的页框块一份为2 。通过list_add()将后面的8个连续页框块加入下级链表(分配阶为3),下级链表通过将area指针自减即可得到,后8个页框块的指针也通过page+size获得,而page仍然指向最初的页框块首页框 。此时还要对分配阶为3的链表更新nr_free,以及通过set_page_order()对后8个页框块设置一些标志 。
第二次遍历将前面8个页框块继续一分为二,将后4个页框块加入area所指向的下级链表(分配阶为2) 。第三次遍历时,循环条件已经不再满足,因此返回前4个页框块首页框的描述符地址page 。
static inline void expand(struct zone *zone, struct page *page,int low, int high, struct free_area *area,int migratetype){unsigned long size = 1 << high;while (high > low) {area--;high--;size >>= 1;VM_BUG_ON(bad_range(zone, &page[size]));list_add(&page[size].lru, &area->free_list[migratetype]);area->nr_free++;set_page_order(&page[size], high);}}static inline void set_page_order(struct page *page, int order){set_page_private(page, order);__SetPageBuddy(page);}

page类 page对象指向

文章插图


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。