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

VM Object


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

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
Pagerへのポインタ。
Default Pager
Device Pager
Vnode Pager   ファイルをVM Objectにマップする


シャドウオブジェクト

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 02:00:51 - kztomita
(2006/06/08 09:54:17 作成)
添付ファイル
shadow.png - kztomita


最近更新したページ