記憶域ドライバーの BypassIO
BypassIO について
BypassIO は、ファイルからの読み取りに最適化された I/O パスです。 このパスの目的は、読み取りの CPU オーバーヘッドを削減することです。これは、Windows で次世代ゲームを読み込んで実行する I/O の要求を満たすのに役立ちます。 BypassIO は、Windows で DirectStorage をサポートするためのインフラストラクチャの一部であり、Windows 11 以降で使用できます。
記憶域ドライバーは BypassIO のサポートを実装し、可能な限り BypassIO を有効にしておくことが重要です。 記憶域スタックのサポートがないと、ゲームのパフォーマンスが低下し、エンド ユーザーのゲーム エクスペリエンスが低下します。
今後の Windows リリースでは、ゲーム以外にも広範なアプリケーションの使用が予定されています。
このインフラストラクチャの一部として、IOCTL_STORAGE_MANAGE_BYPASS_IO と同等の FSCTL_MANAGE_BYPASS_IO が追加されました。 IOCTL_STORAGE_MANAGE_BYPASS_IO はファイル システムによってボリューム/記憶域スタックに送信されますが、ミニフィルターは FSCTL_MANAGE_BYPASS_IOを処理します。 これらの制御コードは、診断できるように設計されています。これらはどちらも BypassIO 要求に失敗したドライバーの ID と、拒否する理由を返します。
ファイル システム フィルターと記憶域スタック全体の BypassIO システム アーキテクチャの詳細については、フィルター ドライバーの BypassIO に関するページを参照してください。
BypassIO サポートの範囲
Windows 11 以降では、BypassIO は次のようにサポートされています。
Windows クライアント システムでのみ。 サーバー システムのサポートは、将来のリリースで追加されます。
NVMe ストレージ デバイスでのみ。 他のストレージ テクノロジのサポートは、今後のリリースで追加される予定です。
NTFS ファイル システムでのみ。 他のファイル システムのサポートは、今後のリリースで追加されます。
キャッシュされていない読み取りのみがサポートされます。 キャッシュされていない書き込みのサポートは、将来のリリースで追加されます。
ファイルでのみサポートされます (ディレクトリまたはボリューム ハンドルではサポートされません)。
BypassIO の DDI の変更と追加
BypassIO サポートを提供するために、記憶域ドライバーに関連する次の DDI が追加されました。
- IOCTL_STORAGE_MANAGE_BYPASS_IO (ファイル システムによってのみ生成されます)
- BPIO_INPUT
- BPIO_OUTPUT
- BPIO_OPERATIONS
- BPIO_INFLAGS 列挙子
- BPIO_OUTFLAGS 列挙子
- BPIO_RESULTS 構造体
BypassIO をサポートするために必要な記憶域スタック ドライバー
Windows 11 以降、記憶域ドライバーの開発者は、ドライバーの INF または MANIFEST ファイルを更新して、次のように、BypassIO のSTORAGE_SUPPORTED_FEATURES_BYPASS_IOを使用して StorageSupportedFeatures インフラストラクチャを追加する必要があります。
- サービス定義の下に "Parameters" キーを定義する
- "StorageSupportedFeatures" という名前の DWORD 値を追加し、この値を 0x1 に設定して BypassIO のサポートを示します。
このレジストリ キーは、ドライバーがバイパス I/O を認識していることをシステムに示します。 ドライバーは、バイパス I/O をサポートする論理ユニット (ディスク) を示すために、 BypassIOSupported が 1 に設定されたStorPortSetUnitAttributesも呼び出す必要があります。
その後、ドライバーは必要に応じてIOCTL_STORAGE_MANAGE_BYPASS_IO を処理します。 記憶域スタック内のいずれかのドライバーが BypassIO に対応していない場合、FS_BPIO_OP_QUERY 操作は失敗します。
Note
BypassIO をサポートできないドライバーでは、引き続き StorageSupportedFeatures 状態を INF に追加し、その理由を指定してドライバー内で適切に拒否する必要があります。
記憶域ドライバーが INF または MANIFEST ファイルを更新して BypassIO のサポートを示さない場合、そのボリュームまたは記憶域ドライバーに対するすべての BypassIO 操作はすぐにブロックされます。 システムは従来の I/O パスにフォールバックするため、ゲームのパフォーマンスが低下します。
IOCTL_STORAGE_MANAGE_BYPASS_IO 実装の詳細
ファイル システム (現在 NTFS) は、必要に応じて生成されたFSCTL_MANAGE_BYPASS_IOに応答してIOCTL_STORAGE_MANAGE_BYPASS_IO コントロール コードを生成します。
IOCTL_STORAGE_MANAGE_BYPASS_IOへの入力は、対応するFSCTL_MANAGE_BYPASS_IOに似ていますが、BypassIO の有効化、無効化、クエリのみをサポートします。
IOCTL_STORAGE_MANAGE_BYPASS_IOからの出力は、対応するFSCTL_MANAGE_BYPASS_IOに似ています。失敗したドライバーの名前と理由、およびドライバーが BypassIO を拒否した理由に関する操作の状態を識別します。 ファイル システムは、ボリュームおよび記憶域スタックからのIOCTL_STORAGE_MANAGE_BYPASS_IO出力を最大FSCTL_MANAGE_BYPASS_IO伝達します。