類似于從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中獲取頁的遷移型別,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/6487.html
標籤:嵌入式
