Linux カーネルがフリー ブロックを管理する方法を理解する上で、概念的な疑問があります。ここまで読んでわかったこと。Buddy Allocator の実装は、通常の 2 の累乗の割り当てを組み合わせた割り当てスキームです。利用できないサイズのブロックが必要な場合は、大きなブロックを 2 つに分割します。これら 2 つのブロックはバディであるため、おそらくバディ アロケーターと呼ばれます。free_area_t
ソースを通じて、構造体の配列が注文ごとに維持され、空きページのブロックのリンクされたリストを指すことを知りました。私が見つけた<linux/mm.h>
typedef struct free_area_struct {
struct list_head free_list;
unsigned long *map;
} free_area_t;
ページブロックのリンクリストのfree_list
ように見えますか? 私の質問は、それが無料ページのリストなのか、使用済みページのリストなのかということです。
そしてmap
、バディのペアの状態を表すビットマップのように見えます。
私の質問は、バディのペアの状態ビットを保持する単一ビットになるにはどうすればよいですか? バディ ペアのブロックの 1 つを使用して割り当て、もう 1 つを空きのままにした場合、状態はどのようになり、それはどのようにして 1 ビットに格納されるのでしょうか? 利用できないブロックサイズが必要な場合に2つの部分に分割できる2の累乗のサイズのブロック全体を表しているので、割り当てられた半分は空いている残りの半分のバディですか? この場合、半分が割り当てられ、半分が空きのままである場合、 のステータスはどうなりますmap
か? どちらも無料だったら?両方が割り当てられている場合はどうなりますか?ブロックの 3 つの状態を表す 2 進値はどうすればよいでしょうか?
編集:さらに読んだ後、最初の疑問は解消されました。つまり、要求された順序で空きブロックが見つからない場合、より高い順序のブロックが 2 つのバディに分割されます。1 つが割り当てられ、もう 1 つが下位のフリー リストに配置されます。フリーページのリンクリストです。