pmap
pmapでは仮想→物理アドレスのマッピングを管理する。変換テーブルの実体はPageDirectoryになる(PageDirectoryの構造はCPUのマニュアル参照)。pmap内のdirbase,pdirbaseがPageDirecotryを指す。pdirbaseは物理アドレスを保持する。
アドレス空間は各スレッド毎に存在するので、pmapも各スレッド毎に存在する(図2)。カーネル空間のpmapはkernel_mapからポイントされている。
物理ページ管理のためにpv_entryがある。各pv_entryは物理ページ1つに対応しており、ページ数分並んだ配列をpv_head_tableが指している(図3)。このテーブルにより、物理テーブルがどのプロセスに使われていて、どの仮想アドレスに対応しているかを素早く取得することができる。
pv_entryのpmapはその物理ページがが属しているpmapへのポインタを持ち、vaはその物理ページに対応する仮想アドレスを保持する。メモリの頭の方(〜avail_start)はカーネルが使用するため、これに該当する物理ページのpv_entryをpmap_init()でカーネル用に設定している。これらのページは、カーネル空間なのでpmapはkernel_pmapを指し、vaはVM_MIN_KERNEL_ADDRESS(カーネル空間の先頭の仮想アドレス)を先頭にPAGE_SIZEずつインクリメントした値を設定している。
[関連関数]
pmap_init()
i386_vm_init()
図1 pmapの構造 (i386の場合)
アドレス空間は各スレッド毎に存在するので、pmapも各スレッド毎に存在する(図2)。カーネル空間のpmapはkernel_mapからポイントされている。
図2 pmapの種類
物理ページ管理のためにpv_entryがある。各pv_entryは物理ページ1つに対応しており、ページ数分並んだ配列をpv_head_tableが指している(図3)。このテーブルにより、物理テーブルがどのプロセスに使われていて、どの仮想アドレスに対応しているかを素早く取得することができる。
pv_entryのpmapはその物理ページがが属しているpmapへのポインタを持ち、vaはその物理ページに対応する仮想アドレスを保持する。メモリの頭の方(〜avail_start)はカーネルが使用するため、これに該当する物理ページのpv_entryをpmap_init()でカーネル用に設定している。これらのページは、カーネル空間なのでpmapはkernel_pmapを指し、vaはVM_MIN_KERNEL_ADDRESS(カーネル空間の先頭の仮想アドレス)を先頭にPAGE_SIZEずつインクリメントした値を設定している。
図3 pv_entry
[関連関数]
pmap_init()
i386_vm_init()