先看个分配图在看下面的函数
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*/
}
}