類似於從zone中的分配,如果無法從指定的遷移類型分配到頁,則會按照fallbacks指定的次序從備用遷移類型中嘗試分配,它定義在page_alloc.c中。 雖然該特性總是編譯進去的,但是該特性只有在系統中有足夠的記憶體可以分配到每種遷移類型對應的鏈表時才有意義,也就是說每個可以遷移性鏈表都要有“適 ...
類似於從zone中的分配,如果無法從指定的遷移類型分配到頁,則會按照fallbacks指定的次序從備用遷移類型中嘗試分配,它定義在page_alloc.c中。
雖然該特性總是編譯進去的,但是該特性只有在系統中有足夠的記憶體可以分配到每種遷移類型對應的鏈表時才有意義,也就是說每個可以遷移性鏈表都要有“適量”的記憶體,內核需要對“適量”的判斷是基於兩個巨集的:
- pageblock_order:內核認為夠大的一個分配的階。
- pageblock_nr_pages:內核認為啟用該特性時每個遷移鏈表需要具有的最少的記憶體頁數。它的定義是基於pageblock_order的。
基於這個“適量”的概念內核會在build_all_zonelists中判斷是否要啟用該特性。page_group_by_mobility_disabled表示是否啟用了該特性。
內核定義了兩個標誌:__GFP_MOVABLE和 __GFP_RECLAIMABLE分別用來表示可移動遷移類型和可回收遷移類型,如果沒有設置這兩個標誌,則表示是不可移動的。如果頁面遷移特性被禁止了,則所有的頁都是不可移動頁。
struct zone中包含了一個欄位pageblock_flags,它用於跟蹤包含pageblock_nr_pages個頁的記憶體區的屬性。在初始化期間,內核自動保證對每個遷移類型,在pageblock_flags中都分配了足夠存儲NR_PAGEBLOCK_BITS個比特的空間。
set_pageblock_migratetype用於設置一個以指定的頁為起始地址的記憶體區的遷移類型。
頁的遷移類型是預先分配好的,對應的比特位總是可用,在頁釋放時,必須將其返還給正確的鏈表。get_pageblock_migratetype可用於從struct page中獲取頁的遷移類型。