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の初期化が完了している。
|
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ページフォルト