VM Object
VM Objectはvmmap内のvm_map_entryから参照される。VM
Objectはメモリリージョン(vm_map_entry)に関する物理ページの管理を行なう。
図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)で個別に保持する。
[関連関数]
vm_object_shadow(object, offset, length)
[関連ページ]
vmmap
ページフォルト
表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の初期化が完了している。 |
pageout | Pageout 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
ページフォルト