記憶體驅動程式中的 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。 這些控制程式代碼是設計成可診斷的:它們都會傳回因略過IO要求失敗的驅動程式身分識別,以及否決它的原因。

如需文件系統篩選和儲存堆疊的 BypassIO 系統架構詳細數據,請參閱 篩選驅動程式 中的 BypassIO。

BypassIO 支援的範圍

從 Windows 11 開始,支援 BypassIO,如下所示:

  • 只在 Windows 用戶端系統上。 未來版本將會新增伺服器系統支援。

  • 僅在 NVMe 儲存裝置上。 未來版本將會新增其他記憶體技術的支援。

  • 只在NTFS檔系統上。 未來版本將會新增其他文件系統的支援。

  • 僅支援非快取讀取。 未來版本將會新增非快取寫入的支援。

  • 僅支援檔案(目錄或磁碟區句柄不支援)。

BypassIO 的 DIS 變更和新增專案

已新增下列與記憶體驅動程式相關的 DIS,以提供 BypassIO 支援:

記憶體堆疊驅動程式需要執行哪些動作以支援 BypassIO

從 Windows 11 開始,記憶體驅動程式開發人員必須更新其驅動程式的 INF 或 MANIFEST 檔案,以新增具有 bypassIO STORAGE_SUPPORTED_FEATURES_BYPASS_IO 的 StorageSupportedFeatures 基礎結構,如下所示:

  • 在您的服務定義下定義「參數」金鑰
  • 新增名為 「StorageSupportedFeatures」 的 DWORD 值,並將此值設定為 0x1,表示 BypassIO 支援。

此登錄機碼會向系統指出驅動程序瞭解略過 I/O。 驅動程式也必須呼叫 StorPortSetUnitAttributes,並將 BypassIOSupported 設定為 1,以指出哪個邏輯單元(磁碟)支援略過 I/O。

然後驅動程序會視需要處理 IOCTL_STORAGE_MANAGE_BYPASS_IO 。 如果記憶體堆疊驅動程式沒有選擇加入,則 FS_BPIO_OP_QUERY 作業會失敗。

注意

永遠無法支援 BypassIO 的驅動程式仍應將 StorageSupportedFeatures 狀態新增至 INF,然後在驅動程式內適當否決,並指定原因。

如果記憶體驅動程式未更新其 INF 或 MANIFEST 檔案,表示 BypassIO 支援,則會立即封鎖該磁碟區或記憶體驅動程式上的所有 BypassIO 作業。 系統會回復到傳統 I/O 路徑,這會導致遊戲效能降低。

IOCTL_STORAGE_MANAGE_BYPASS_IO實作詳細數據

文件系統(目前為NTFS)會產生IOCTL_STORAGE_MANAGE_BYPASS_IO控件程式代碼,以視需要響應產生的FSCTL_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