知識マップ: 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の流れを実際に観察できます。

Windows I/Oアーキテクチャー(IRP・デバイススタック)の知識マップI/Oマネージャーがオブジェクトマネージャーの名前空間で宛先を解決し、IRPを組み立ててデバイススタックへ流すこと、ドライバーオブジェクト・デバイスオブジェクト・ファイルオブジェクトの3つの関係、ファストI/Oという近道、CloseHandleが引き起こすIRP_MJ_CLEANUPとIRP_MJ_CLOSEの2段階、WinObjとProcess Monitorによる観察手段を示す図利用する利用する利用する利用する利用する利用する前提とするで確認できるに保存されるに保存される前提とする前提とする利用する前提とする利用する前提とする前提とする前提とする前提とする利用する前提とする前提とする利用する利用する前提とする利用する利用する前提とする利用するで確認できるで確認できる前提とする前提とする両立しない原因になり得る原因になり得る軽減する原因になり得る前提とする前提とするI/OマネージャーIRP(I/O要求パケット)オブジェクトマネージャーデバイススタックディスパッチルーチンメジャーファンクションコードファストI/OカーネルモードWinObjMS-DOSデバイス名のシンボリックリンクデバイスオブジェクトCreateFileネットワークリダイレクターファイルオブジェクトファイルハンドルユーザーモードドライバーオブジェクトNTFSI/OスタックロケーションフィルタードライバーProcess Monitor(procmon.exe)キャッシュマネージャー同期I/O非同期I/OCloseHandleIRP_MJ_CLEANUPIRP_MJ_CLOSEハンドルリーク

概念間の関係(全40件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

I/Oマネージャー
Windowsカーネルモードで、アプリケーションとデバイスドライバーの間のI/O要求を統括するコンポーネント。要求のほとんどをIRPに詰めてデバイススタックへ流す。
IRP(I/O要求パケット)
デバイスドライバーに送られる要求のほとんどが詰め込まれるパケット。要求全体のヘッダーと、経由するドライバーの数だけ並ぶI/Oスタックロケーションを持つ。
オブジェクトマネージャー
デバイス・イベント・共有メモリセクションなどをすべて「オブジェクト」として単一の階層的な名前空間で管理するWindowsカーネルのコンポーネント。CreateFileの名前解決はここから始まる。
MS-DOSデバイス名のシンボリックリンク
MS-DOSデバイス名(ドライブレターやCOMポート名など)からNTデバイス名への、オブジェクトマネージャー名前空間内のリンク。ドライバーがIoCreateSymbolicLinkで作る。NTFSのファイルシステムレベルのシンボリックリンク(リパースポイント)とは別の、カーネルオブジェクト名前空間の仕組み。
デバイスオブジェクト
ドライバーが自分の管理するデバイスごとに作る、I/O要求の宛先となるカーネルオブジェクト。物理デバイスとは限らず、ボリュームやフィルターのための仮想的な存在もある。
CreateFile
ファイルだけでなく物理ディスク・ボリューム・COMポート・パイプなどのデバイスも、名前解決を通じて共通に開けるWin32 API。開いた対象ごとにファイルオブジェクトが作られる。
ファイルオブジェクト
CreateFileなどでファイル(またはデバイス)を開くたびにカーネルが作る、開いた1回ぶんのセッション状態を表すオブジェクト。現在のバイトオフセットや共有モードを保持する。
ファイルハンドル
プロセスのハンドルテーブルを経由した、ファイルオブジェクトへの参照。CreateFileが返し、ユーザーモードのプロセスがI/O操作の対象を指定するのに使う値。
ドライバーオブジェクト
ドライバーのロード時にI/Oマネージャーが作るオブジェクト。要求の種類ごとの処理関数(ディスパッチルーチン)への対応表であるMajorFunction配列を持つ。
デバイススタック
積み重なった複数のデバイスオブジェクトの列。IRPはスタック最上位のデバイスオブジェクトへ送られ、各層で処理または下位への転送が行われる。
NTFS
現行のWindowsが標準で使うファイルシステム。MFT(マスターファイルテーブル)などの構造でボリューム上のファイルを管理する。
I/Oスタックロケーション
IRP内に、経由予定のドライバーの数だけ用意される領域。各ドライバー用のメジャー/マイナーファンクションコードとパラメーターを保持する。
フィルタードライバー
デバイススタックに割り込むためのデバイスオブジェクトを挟み込み、通過するI/O要求を検査・加工するドライバー。ウイルス対策ソフトやProcess Monitorもこの位置に立つ。
ファストI/O
キャッシュに載っているファイルへの同期I/Oのために、IRPを組み立てずキャッシュマネージャーと直接データをやり取りする高速経路。処理できない場合は通常のIRP経路に折り返す。
CloseHandle
プロセスのハンドルテーブルからエントリを1つ削除するWin32 API。「ファイルを閉じる」ことそのものではない。
IRP_MJ_CLEANUP
あるファイルオブジェクトの最後のハンドルが閉じられたことを示すIRP。未完了I/Oの取り消しやロック解放を行うが、ファイルオブジェクト自体が即座に解放されるとは限らない。
ディスパッチルーチン
ドライバーオブジェクトのMajorFunction配列に登録された、特定のメジャーファンクションコード(IRP_MJ_READなど)に対応するIRP処理関数。
ネットワークリダイレクター
\Device\Mupという単一のデバイスオブジェクトとして名前空間に存在し、UNCパス(\\server\share)の要求をネットワーク越しに運ぶコンポーネント。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。