BSDカーネルの設計と実装
第5章
5.13.5 ページ利用情報の管理
BSD読書会
@geek_alice
機種依存のページ管理
● ページの利用と修正に関する情報をハードウェ
アから取得する必要がある。
● vm_pmap構造体を用いる
非機種依存のページ管理
● ハードウェアのマッピングテーブルの詳細を理
解しなくても、pmapモジュールが参照と修正
ビット情報の問い合わせや、初期化を行うイン
ターフェースを提供してくれる。
ページアウトデーモンの役割
● ページの参照ビットを初期化する。
● ページの利用カウントを更新する。
マッピングが存在しないページへの問い合
わせ
マッピングが削除されている場合、ハードウェ
アが管理するページテーブルやTLB以外にもど
こかで管理されなければいけない。
マッピングが存在しないページへの問い合
わせ
● vm_page構造体のdirtyフィールドにページの
修正情報を保管する。
● dirtyビットが設定されていれば問い合わせに対
してTRUEを返す。
● これは過去の情報なので、そのページの現行の
マッピングに対応するページテーブルエントリ
の状態ビットも調べる。
vm_page構造体
struct vm_page {
● TAILQ_ENTRY(vm_page) pageq; /* page queue or free list (Q) */
●TAILQ_ENTRY(vm_page) listq; /* pages in same object (O) */
●vm_object_t object; /* which object am I in (O,P)*/
●
vm_pindex_t pindex; /* offset into object (O,P) */
●
vm_paddr_t phys_addr; /* physical address of page */
●
struct md_page md; /* machine dependant stuff */
●uint8_t queue; /* page queue index (P,Q) */
●int8_t segind;
●short hold_count; /* page hold count (P) */
●uint8_t order; /* index of the buddy queue */
●uint8_t pool;
●
u_short cow; /* page cow mapping count (P) */
●
u_int wire_count; /* wired down maps refs (P) */
●
uint8_t aflags; /* access is atomic */
●uint8_t oflags; /* page VPO_* flags (O) */
●uint16_t flags; /* page PG_* flags (P) */
●u_char act_count; /* page usage count (P) */
●u_char busy; /* page busy count (O) */
●vm_page_bits_t valid; /* map of valid DEV_BSIZE chunks (O) */
●
vm_page_bits_t dirty; /* map of dirty DEV_BSIZE chunks (M) */
●
};
act_countフィールドとflagsに
ページの参照情報が保持される
(ページアウトデーモンによっ
て定期的に更新される)
pmap_ts_referenced()関数
● ページアウトデーモンから呼び出される
● ページの参照数を取得する関数
●
管理対象外の物理ページが指定されると0を返す
● pv_entry構造体を走査してpv_entryに対応する
ページテーブルエントリの参照ビットを調べて初
期化する
● 発見された参照ビットの数を返す
5.13.6 物理ページの初期化
仮想記憶関数
物理メモリを初期化するための高次の関数が2つ用
意されている。
● pmap_zero_page()
● 物理アドレスを受け取って、そのページをゼロ充填す
る。内部ではbzero()を用いる。
● pmap_copy_page()
● 2つの物理アドレスを受け取り、最初のページの内容を次
のページにコピーする。内部ではbcopy()を用いる。
5.13.7 内部データ構造の管理
pmap_pinit()関数
●
機種依存のvm_pmap構造体の実態を作成す
る。
● fork,execを実行する際に新しいアドレス空間
を作成するためにvmspace_fork(),
vmspace_exec()関数によって使用される。
pmap_release()関数
● pmapに使われているの資源を開放する。
●
プロセスが終了した際にvmspaceを開放する
ために、vmspace_free()関数が使用される。

Bs dread5.13.5