[[PageNavi(internal24-navi)]]
{{{ comment
h2w-title:フリーページ管理
}}}
= フリーページ管理 = #SECTION04400000000000000000
v2.4からはフリーページはzoneと呼ばれる複数の領域に分けて管理されるようになった。v2.2までと異なり、カーネル空間にストレートマッピングすることのできない領域の物理メモリまで管理できるようにするために、二つの領域を明確に別のzoneとして分離管理している。カーネル空間にストレートマッピングされていない領域はHighMemと呼ばれ、アクセス前には仮想空間にマップするという処理が必要となる。(伝統的UNIXでは、通常カーネル空間に全ての物理メモリをストレートマッピングするという手法はとっていないため、このような区別は無い)
また、更にDMA可能領域も意識し、別のzoneとして管理しなければならないのは、古いPCのアーキティクチャに縛られているためである。
また、v2.4からは非連続な物理メモリ領域を管理するための汎用的なコードが追加された。(ただし、Intel + PC/ATアーキティクチャのマシンでは物理メモリ領域は一つのみ)
この領域のページ群は下記データ構造で管理される。各ゾーンに属するメモリは連続するページのサイズ毎(ページ×2の巾乗サイズ)に下図のようにフリーリスト管理されている。
[[Embed(internal24-images:img78.gif)]]
(XXX: そのうちHighMem管理も追加したいところ)
'''主な操作関数群'''
* alloc_page関数、alloc_page関数、__alloc_pages関数、
* ページを確保する。どのゾーンから何ページ分のメモリを 確保するか引数で指定する。
* フリーページがなければ、INACTIVE_CLEANリスト上のページから 確保する。
* フリーリストに求めるサイズのページ
* free_pages関数、free_page関数、__free_pages関数、__free_pages_ok関数
* ページを解放する。
* __get_free_pages関数、__get_free_page関数
* __alloc_pages関数と同じだが、ページではなくページの アドレスを返却値とする。
* __get_dma_pages関数
* __get_free_pages関数と同じだが、強制的にDMAゾーンから ページを確保する。
* get_zeroed_page関数
* __get_free_page関数と同じだが、ページの0クリアする。
* get_page関数
* ページの参照数を1増やす
* put_page関数
* ページの参照数を1減らす。参照数が0になったらページを解放する。
----
''(NIS)HirokazuTakahashi [[BR]]2000年12月09日 (土) 23時55分06秒 JST''1
[[PageNavi(internal24-navi)]]