■
次はメモリ管理。図を描いて整理。
kernelから作っているとメモリのFreeリストを使うにもその構造体用のメモリをmallocするわけにはいかないので予めメモリ管理構造体の配列を作っておく。この構造体は以下のような要素を持たす。
typedef struct _MemoryHole { u_int32_t hole_base; u_int32_t hole_length; MemoryHole* hole_next; MemoryHole* hole_prev; } MemoryHole;
これを十分な数用意しておきまずはメモリ管理構造体空きリストとして配列の番号順に繋いでいく。Free管理リストの初期設定は空いているメモリ領域のbaseとlengthをメモリ管理構造体空きリストから一つ選んだ(先頭から取る)構造体にセットしFreeリストに繋ぐ。
メモリ取得と破棄は以下のような流れ
メモリ取得 1. Freeメモリ管理リストから必要なサイズ以上の空き領域が あるかリストの先頭から検索する(FirstFit algorithm)。 2. 空きがあればFree管理リストからその構造体の中身(base とlength)を変更しlengthが短すぎれば隣のリストとmerge し、リストをdelete メモリ破棄 1. Freeメモリのbase順になるような位置にメモリ管理構造体 空きリストから取得してきた空き構造体を挿入する。 2. 挿入した空きリストと前後のリストが連続しているかどうか 調べ、連続していればmergeし、リストをdeleteする。