スレッドの仮想アドレス空間を管理しているデータ構造を図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コマンドを実行することで確認できる。