知識マップ: Windowsメモリの深層(第3回) ── セクションオブジェクトとコピーオンライト:DLLとファイルマッピングの正体
記事「Windowsメモリの深層(第3回) ── セクションオブジェクトとコピーオンライト:DLLとファイルマッピングの正体」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
セクションオブジェクトは共有できるメモリの区画を表し、各プロセスはその一部をビューとして自分の仮想空間へマップします。共有されるのは仮想アドレスではなくセクション内の内容なので、同じオフセットをマップしてもビューの開始アドレスはプロセスごとに異なり得ます。だから共有構造に生ポインターを保存してはいけません。セクションはファイルバックとページファイルバックに分かれ、EXEやDLLのロードはSEC_IMAGEのイメージマッピング、通常のファイルはデータマッピングになります。読み取り中は同じ物理ページを共有し、CoWページへの書き込みで保護フォルトが起きた時点でそのページだけをコピーして書き手のPTEを差し替えます。CoW後もVirtualQueryのTypeはMEM_MAPPED/MEM_IMAGEのままなので、私有化の確認にはQueryWorkingSetExのSharedビットを使います。
flowchart LR
accTitle: セクションオブジェクトとコピーオンライトの知識マップ
accDescr: セクションオブジェクトとビューの分離、ファイルバックとページファイルバックの違い、イメージマッピングとデータマッピングの区別、CoWで書き込み時に物理ページが分岐する流れ、CoW後もMEM_MAPPED/MEM_IMAGEのままであること、SECTION_OBJECT_POINTERSが分ける3経路を示す図
section_object["セクションオブジェクト"]
copy_on_write["コピーオンライト(CoW)"]
section_view["ビュー(セクションのマップ)"]
page_fault["ページフォールト"]
raw_pointer_sharing["生ポインターの共有"]
file_backed_section["ファイルバックセクション"]
standby_page_list["Standbyリスト"]
pagefile_backed_section["ページファイルバックセクション"]
shared_mutable_state["共有可変状態"]
image_section["イメージマッピング(SEC_IMAGE)"]
data_section["データマッピング"]
page_table_entry["ページテーブルとPTE"]
file_map_write["FILE_MAP_WRITE(共有書き込み)"]
queryworkingsetex_shared["QueryWorkingSetExのSharedビット"]
memory_commit["Commit(MEM_COMMIT)"]
vmmap["VMMap"]
process_explorer["Process Explorer"]
section_object_pointers["SECTION_OBJECT_POINTERS"]
cache_manager["キャッシュマネージャー"]
section_object -->|"利用する"| section_view
section_view -->|"原因になり得る"| page_fault
raw_pointer_sharing -->|"両立しない"| section_view
file_backed_section -->|"実装を担う"| section_object
file_backed_section -->|"原因になり得る"| standby_page_list
pagefile_backed_section -->|"実装を担う"| section_object
pagefile_backed_section -.->|"原因になり得る"| shared_mutable_state
image_section -->|"実装を担う"| section_object
data_section -->|"実装を担う"| section_object
image_section -.->|"利用する"| copy_on_write
copy_on_write -->|"原因になり得る"| page_fault
copy_on_write -->|"利用する"| page_table_entry
file_map_write -->|"両立しない"| copy_on_write
copy_on_write -->|"で確認できる"| queryworkingsetex_shared
copy_on_write -->|"前提とする"| memory_commit
copy_on_write -->|"で確認できる"| vmmap
section_object -->|"で確認できる"| process_explorer
section_object_pointers -->|"実装を担う"| section_object
cache_manager -->|"利用する"| section_object_pointers
概念間の関係(全19件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- セクションオブジェクトはビュー(セクションのマップ)を利用します。
- ビュー(セクションのマップ)はページフォールトの原因になることがあります。
- 生ポインターの共有はビュー(セクションのマップ)と両立しません。
- ファイルバックセクションはセクションオブジェクトの実装を担います。
- ファイルバックセクションはStandbyリストの原因になることがあります。
- ページファイルバックセクションはセクションオブジェクトの実装を担います。
- ページファイルバックセクションは共有可変状態の原因になることがあります。
- イメージマッピング(SEC_IMAGE)はセクションオブジェクトの実装を担います。
- データマッピングはセクションオブジェクトの実装を担います。
- イメージマッピング(SEC_IMAGE)はコピーオンライト(CoW)を利用します。
- コピーオンライト(CoW)はページフォールトの原因になることがあります。
- コピーオンライト(CoW)はページテーブルとPTEを利用します。
- FILE_MAP_WRITE(共有書き込み)はコピーオンライト(CoW)と両立しません。
- コピーオンライト(CoW)はQueryWorkingSetExのSharedビットで確認できます。
- コピーオンライト(CoW)はCommit(MEM_COMMIT)を前提とします。
- コピーオンライト(CoW)はVMMapで確認できます。
- セクションオブジェクトはProcess Explorerで確認できます。
- SECTION_OBJECT_POINTERSはセクションオブジェクトの実装を担います。
- キャッシュマネージャーはSECTION_OBJECT_POINTERSを利用します。
主要概念の定義
機械可読データ
このデータセットについて
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。