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

VM Object


Rev.31を表示中。最新版はこちら

VM Objectはvmmap内のvm_map_entryから参照される。VM Objectはメモリリージョン(vm_map_entry)に関する物理ページの管理を行なう。


表1 vm_objectのフィールド(一部)
フィールド
意味
memq
オブジェクトが持つresidentページのチェーン。
resident_page_count
residentページ数(memqにつながれているページ数)
shadow
shadowオブジェクトがshadowしているオブジェクトへのポインタ
pager
Memory Object(Pager)へのポインタ。VM ObjectはこのPagerを使って物理ページへデータを読み込んだり、外部記憶装置へ書き出したりする。Default Pager,Device Pager,Vnode Pagerの3種類がある。
pager_created
Pagerが関連づけられている。
pager_initialized
Pagerの初期化が完了している。


シャドウオブジェクト

fork()などをしてCOW(Copy On Write)形式のページ共有をする場合などにShadowが作られる。Shadow ObjectはShadowするオブジェクトへのポインタを保持し、そのVM Objectが持つページを共有する。(Shadowオブジェクトでミラーリングしているイメージ。)

図1にプロセス間でCOW形式でページを共有している時のshadow objectの構造を示す。プロセスAとBはObject CをそれぞれObject A,Object BでShadowしてPage A,Bを共有する。Shadowした直後はページを完全に共有しているので、Object A,Object Bのmemqは空となる。また、COWでページを共有しているためPage A,BのPageTableEntry(PTE)はReadOnlyに設定されている。

プロセスBが共有していたPage Aを書き換えるとページフォルトが発生して、vm_fault()でページが複製されPageA'が作成されてプロセスBのShadow Object(Object B)につながれる。プロセスAは従来通りPageAを使用し、プロセスBはPageA'を使用することになる。Page Bは従来通りObject Cで共有される。

このように、基本的にはShadowしているオブジェクト(ここではObject C)でページを共有して、COWを行ないプロセス固有になった分をShadow Object(Object AとかB)で個別に保持する。



図1 Shadow Objectの例

[関連関数]
vm_object_shadow(object, offset, length)
objectのshadowオブジェクトを作成する。


[関連ページ]
vmmap
ページフォルト


最終更新 2006/06/13 19:09:30 - kztomita
(2006/06/08 09:54:17 作成)
添付ファイル
shadow.png - kztomita


最近更新したページ