linux內核函數夥伴系統部分expand()

 先看個分配圖在看下面的函數

 

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*/
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章