知識マップ: Windows I/Oの深層(第1回) ── すべての読み書きはIRPになる:I/Oシステムの全体像
記事「Windows I/Oの深層(第1回) ── すべての読み書きはIRPになる:I/Oシステムの全体像」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
WindowsのI/Oは、オブジェクトマネージャーの名前空間でCreateFileの名前をデバイスオブジェクトへ解決し、要求をIRP(I/O Request Packet)に詰めてデバイススタックへ流す、という一本の設計で貫かれています。登場人物はドライバーオブジェクト(処理関数の表)・デバイスオブジェクト(要求の宛先)・ファイルオブジェクト(開いた1回の状態)の3つで、キャッシュ済みデータの同期読み書きだけはファストI/OというIRPを作らない近道が使われます。WinObjで名前空間を、Process MonitorでIRP/ファストI/Oの流れを実際に観察できます。
flowchart LR
accTitle: Windows I/Oアーキテクチャー(IRP・デバイススタック)の知識マップ
accDescr: I/Oマネージャーがオブジェクトマネージャーの名前空間で宛先を解決し、IRPを組み立ててデバイススタックへ流すこと、ドライバーオブジェクト・デバイスオブジェクト・ファイルオブジェクトの3つの関係、ファストI/Oという近道、CloseHandleが引き起こすIRP_MJ_CLEANUPとIRP_MJ_CLOSEの2段階、WinObjとProcess Monitorによる観察手段を示す図
io_manager["I/Oマネージャー"]
irp["IRP(I/O要求パケット)"]
object_manager["オブジェクトマネージャー"]
device_stack["デバイススタック"]
dispatch_routine["ディスパッチルーチン"]
irp_major_function["メジャーファンクションコード"]
fast_io["ファストI/O"]
kernel_mode["カーネルモード"]
winobj["WinObj"]
dos_device_symlink["MS-DOSデバイス名のシンボリックリンク"]
device_object["デバイスオブジェクト"]
createfile["CreateFile"]
network_redirector["ネットワークリダイレクター"]
file_object["ファイルオブジェクト"]
file_handle["ファイルハンドル"]
user_mode["ユーザーモード"]
driver_object["ドライバーオブジェクト"]
ntfs["NTFS"]
io_stack_location["I/Oスタックロケーション"]
filter_driver["フィルタードライバー"]
procmon["Process Monitor(procmon.exe)"]
cache_manager["キャッシュマネージャー"]
synchronous_io["同期I/O"]
asynchronous_io["非同期I/O"]
closehandle["CloseHandle"]
irp_mj_cleanup["IRP_MJ_CLEANUP"]
irp_mj_close["IRP_MJ_CLOSE"]
handle_leak["ハンドルリーク"]
io_manager -->|"利用する"| irp
io_manager -->|"利用する"| object_manager
io_manager -->|"利用する"| device_stack
io_manager -->|"利用する"| dispatch_routine
io_manager -->|"利用する"| irp_major_function
io_manager -->|"利用する"| fast_io
io_manager -->|"前提とする"| kernel_mode
object_manager -->|"で確認できる"| winobj
dos_device_symlink -->|"に保存される"| object_manager
device_object -->|"に保存される"| object_manager
dos_device_symlink -->|"前提とする"| device_object
createfile -->|"前提とする"| object_manager
createfile -.->|"利用する"| dos_device_symlink
createfile -.->|"前提とする"| network_redirector
createfile -->|"利用する"| file_object
file_object -->|"前提とする"| device_object
file_object -->|"前提とする"| kernel_mode
file_handle -->|"前提とする"| file_object
file_handle -->|"前提とする"| user_mode
driver_object -->|"利用する"| dispatch_routine
driver_object -->|"前提とする"| kernel_mode
device_object -->|"前提とする"| driver_object
device_stack -->|"利用する"| device_object
device_stack -.->|"利用する"| ntfs
ntfs -->|"前提とする"| device_object
irp -->|"利用する"| io_stack_location
io_stack_location -->|"利用する"| irp_major_function
irp -->|"前提とする"| device_stack
filter_driver -->|"利用する"| device_object
irp -->|"で確認できる"| procmon
fast_io -->|"で確認できる"| procmon
fast_io -->|"前提とする"| cache_manager
fast_io -->|"前提とする"| synchronous_io
fast_io -->|"両立しない"| asynchronous_io
closehandle -->|"原因になり得る"| irp_mj_cleanup
irp_mj_cleanup -.->|"原因になり得る"| irp_mj_close
closehandle -->|"軽減する"| handle_leak
file_object -.->|"原因になり得る"| handle_leak
dispatch_routine -->|"前提とする"| irp_major_function
network_redirector -->|"前提とする"| device_object
概念間の関係(全40件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- I/OマネージャーはIRP(I/O要求パケット)を利用します。
- I/Oマネージャーはオブジェクトマネージャーを利用します。
- I/Oマネージャーはデバイススタックを利用します。
- I/Oマネージャーはディスパッチルーチンを利用します。
- I/Oマネージャーはメジャーファンクションコードを利用します。
- I/OマネージャーはファストI/Oを利用します。
- I/Oマネージャーはカーネルモードを前提とします。
- オブジェクトマネージャーはWinObjで確認できます。
- MS-DOSデバイス名のシンボリックリンクはオブジェクトマネージャーに保存されます。
- デバイスオブジェクトはオブジェクトマネージャーに保存されます。
- MS-DOSデバイス名のシンボリックリンクはデバイスオブジェクトを前提とします。
- CreateFileはオブジェクトマネージャーを前提とします。
- CreateFileはMS-DOSデバイス名のシンボリックリンクを利用します。
- CreateFileはネットワークリダイレクターを前提とします。
- CreateFileはファイルオブジェクトを利用します。
- ファイルオブジェクトはデバイスオブジェクトを前提とします。
- ファイルオブジェクトはカーネルモードを前提とします。
- ファイルハンドルはファイルオブジェクトを前提とします。
- ファイルハンドルはユーザーモードを前提とします。
- ドライバーオブジェクトはディスパッチルーチンを利用します。
- ドライバーオブジェクトはカーネルモードを前提とします。
- デバイスオブジェクトはドライバーオブジェクトを前提とします。
- デバイススタックはデバイスオブジェクトを利用します。
- デバイススタックはNTFSを利用します。
- NTFSはデバイスオブジェクトを前提とします。
- IRP(I/O要求パケット)はI/Oスタックロケーションを利用します。
- I/Oスタックロケーションはメジャーファンクションコードを利用します。
- IRP(I/O要求パケット)はデバイススタックを前提とします。
- フィルタードライバーはデバイスオブジェクトを利用します。
- IRP(I/O要求パケット)はProcess Monitor(procmon.exe)で確認できます。
- ファストI/OはProcess Monitor(procmon.exe)で確認できます。
- ファストI/Oはキャッシュマネージャーを前提とします。
- ファストI/Oは同期I/Oを前提とします。
- ファストI/Oは非同期I/Oと両立しません。
- CloseHandleはIRP_MJ_CLEANUPの原因になることがあります。
- IRP_MJ_CLEANUPはIRP_MJ_CLOSEの原因になることがあります。
- CloseHandleはハンドルリークを軽減します。
- ファイルオブジェクトはハンドルリークの原因になることがあります。
- ディスパッチルーチンはメジャーファンクションコードを前提とします。
- ネットワークリダイレクターはデバイスオブジェクトを前提とします。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。