Buddy System
Data Structure
新增 Buddy 的 data structure,並在 page 的 structure 中新增 linked list,這邊的設計參考 linux 的 list_head
include/mm.h
|
|
src/mm.c
|
|
Initialization
用 linked list 維護 buddy 的 order,一開始僅有最高的 order 有超過一個 element,其餘 order 最多只會有一個 element,且必定整除。

src/mm.c
|
|
Allocator
src/mm.c
從參數傳進來的 order 開始搜尋是否有可用的 block,將其從 buddy pop 出來,回傳第一個 page 的 virtual address
|
|
從可用的 buddy 中取出一個 block,這個 buddy 的 order 可能超過目標的 order,所以將其遞迴的拆分到目標的 order,以避免浪費
|
|
若尚未到達目標的 order,就將當前 order 拆成兩半,push bottom 到下一個 order,將 top 繼續遞迴,維護時僅需要將 buddy 中的第一個 page 做標記即可
|
|
Coalesce the free block
在 free 時,若有兩個同 order 的 buddy 可以合併就將其合併到上一個 order
src/mm.c
由 pfn 與 order 可以取得自己這個 page 的 buddy
The page frame number(PFN) and the block size order can be used to find the page frame’s buddy. For example, if a memory block’s PFN is 8 and the block size is 16KB (order = 2) you can find its buddy by 0b1000 xor 0b100 = 0b1100 = 12.
|
|
若 buddy 正在使用或是 buddy 的 order 與自己不同就不進行 merge,merge 時依照 bottom, top 的順序傳入 buddy_merge
,維護時 free 也僅需要維護 buddy 最開頭的 page
|
|
若 bottom 的 buddy 又符合 merge 的條件,就繼續遞迴的 merge 下去,直到 coalesce 成一塊更大的 buddy
|
|
Usage
在之前使用 page_alloc
要一塊 page 空間的函式,現在可以使用 buddy_alloc(0)
取代,並改用 buddy_free(addr)
釋放記憶體