Mac OS Xのカーネル Xnuのメモ書き

vmmap


スレッドの仮想アドレス空間を管理しているデータ構造を図1に示す。各スレッドのthread構造体のmapポインタが、仮想アドレス管理のためデータの大元、vm_mapへのポインタを持つ。vm_mapにはvm_map_entryのリストがあり、そのスレッドにどの仮想アドレス領域が割り当てられているかを管理している。1つのvm_map_entryが1つの連続した仮想アドレス領域(Region)を示す。また、pmapポインタは仮想→物理アドレスへ変換を行なうためのPageTableへのポインタを保持している(参照pmap)。


図1 論理アドレス空間の管理

*1 submap
objectは共用体で、vm_map_entry_t.is_sub_map == 0ならvm_objectへのポインタ。1ならvm_mapへのポインタでSubmapになる。Submapは複数のプロセスでマップを共用する時に使用する。SharedLibiraryが配置されるRegionもSubmapが使われている。


表1 vm_map_entry内の主なフィールド
フィールド
意味
vme_start
Regionの開始仮想アドレス
vme_end
Regionの終了仮想アドレス
object
vm_objectかSubmapへのポインタ。
is_sub_map = TRUEだとSubmap。
is_shared
他のvmmapとページを共有している。
is_sub_map
objectはsub_mapである。
needs_copy
Copy On Write用にshadow objectを作る必要があるRegionの場合TRUE
protection
Regionへ許可されているアクセス種別。
VM_PROT_READ    Read可
VM_PROT_WRITE   Write可
VM_PROT_EXECUTE コードの実行可
inheritance
vm_map_fork()でvmmapを複製する時の動作
VM_INHERIT_NONE   複製しない
VM_INHERIT_SHARE  ページを共有する
VM_INHERIT_COPY   ページをコピーする(実際にはページをReadOnlyにしてCOWの設定をする)


[関連コマンド]
プロセスのvmmapはシェルからvmmapコマンドを実行することで確認できる。


最終更新 2006/06/11 18:00:28 - kztomita
(2006/03/27 13:06:35 作成)
添付ファイル
vmmap.png - kztomita


最近更新したページ