1.原理
linux的夥伴演算法把所有的空閒頁面分為10個塊組,每組中塊的大小是2的冪次方個頁面,例如,第0組中塊的大小都為20(1個頁面),第1組中塊的大小為都為21(2個頁面),第9組中塊的大小都為29(512個頁面)。也就是說,每一組中塊的大小是相同的,且這同樣大小的塊形成乙個鍊錶。
我們通過乙個簡單的例子來說明該演算法的工作原理。
假設要求分配的塊其大小為128個頁面(由多個頁面組成的塊我們就叫做頁面塊)。該演算法先在塊大小為128個頁面的鍊錶中查詢,看是否有這樣乙個空閒塊。如果有,就直接分配;如果沒有,該演算法會查詢下乙個更大的塊,具體地說,就是在塊大小為256個頁面的鍊錶中查詢乙個空閒塊。如果存在這樣的空閒塊,核心就把這256個頁面分為兩等份,乙份分配出去,另乙份插入到塊大小為128個頁面的鍊錶中。如果在塊大小為256個頁面的鍊錶中也沒有找到空閒頁塊,就繼續找更大的塊,即512個頁面的塊。如果存在這樣的塊,核心就從512個頁面的塊中分出128個頁面滿足請求,然後從384個頁面中取出256個頁面插入到塊大小為256個頁面的鍊錶中。然後把剩餘的128個頁面插入到塊大小為128個頁面的鍊錶中。如果512個頁面的鍊錶中還沒有空閒塊,該演算法就放棄分配,並發出出錯訊號。
以上過程的逆過程就是塊的釋放過程,這也是該演算法名字的來由。滿足以下條件的兩個塊稱為夥伴:
·兩個塊的大小相同
·兩個塊的實體地址連續
夥伴演算法把滿足以上條件的兩個塊合併為乙個塊,該演算法是迭代演算法,如果合併後的塊還可以跟相鄰的塊進行合併,那麼該演算法就繼續合併。
2.資料結構
在6.2.5節中所介紹的管理區資料結構struct zone_struct中,涉及到空閒區資料結構:
free_area_t free_area[max_order];
我們再次對free_area_t給予較詳細的描述。
#difinemax_order10
typestruct free_area_struct free_area_t
其中list_head域是乙個通用的雙向鍊錶結構,鍊錶中元素的型別將為mem_map_t(即struct page結構)。map域指向乙個位圖,其大小取決於現有的頁面數。free_area第k項位圖的每一位,描述的就是大小為2k個頁面的兩個夥伴塊的狀態。如果點陣圖的某位為0,表示一對兄弟塊中或者兩個都空閒,或者兩個都被分配,如果為1,肯定有一塊已被分配。當兄弟塊都空閒時,核心把它們當作乙個大小為2k+1的單獨快來處理。如圖6.9給出該資料結構的示意圖:
圖6.9夥伴系統使用的資料結構
圖6.9中,free_aea陣列的元素0包含了乙個空閒頁(頁面編號為0);而元素2則包含了兩個以4個頁面為大小的空閒頁面塊,第乙個頁面塊的起始編號為4,而第二個頁面塊的起始編號為56。
我們曾提到,當需要分配若干個記憶體頁面時,用於dma的記憶體頁面必須是連續的。其實為了便於管理,從夥伴演算法可以看出,只要請求分配的塊大小不超過512個頁面(2kb),核心就盡量分配連續的頁面。
核心原始碼學習 夥伴演算法
核心原始碼學習 夥伴演算法 2008 09 14 09 39 1 原理 linux的夥伴演算法把所有的空閒頁面分為10個塊組,每組中塊的大小是2的冪次方個頁面,例如,第0組中塊的大小都為20 1個頁面 第1組中塊的大小為都為21 2個頁面 第9組中塊的大小都為29 512個頁面 也就是說,每一組中塊...
linux核心原始碼
1.機器當前使用的核心版本 apuser jianzhangubtnb uname a linux jianzhangubtnb 3.2.0 23 generic 36 ubuntu smp tue apr 10 20 39 51 utc 2012 x86 64 x86 64 x86 64 gnu ...
Xilinx Zynq Linux核心原始碼編譯
記得選release 裡面 tag linux xlnx xilinx v2014.4.tar.gz 和 u boot xlnx xilinx v2014.4.tar.gz 版本,其他版本未嘗試。如果你成功來記得告訴我!交叉編譯環境要提前裝好 which arm xilinx linux gnuea...