先看個分配圖在看下面的函數
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;//現在分配的page中頁的個數
while (high > low) //當前頁階 大於需要的頁階
{
area--;/*area減1得到下一級order對應的area*/
high--;/*high減1表明進行了一次拆分*/
size >>= 1;/*拆分一次size就要除以2*/
VM_BUG_ON(bad_range(zone, &page[size]));
//將頁的另一半加入到上個夥伴鏈中
list_add(&page[size].lru, &area->free_list[migratetype]);
area->nr_free++;/*該order區域的塊數加1*/
set_page_order(&page[size], high);/*該order區域的塊數加1*/
}
}