篩選驅動程式的略過IO
關於 BypassIO
從 Windows 11 開始,BypassIO 已新增為從檔案讀取的優化 I/O 路徑。 此路徑的目標是減少執行讀取的CPU額外負荷,這有助於符合在Windows上載入和執行新一代遊戲的I/O需求。 BypassIO 是基礎結構的一部分,可支援 Windows 上的 DirectStorage。
迷你篩選程序必須實作 BypassIO 的支援,並盡可能啟用 BypassIO。 如果沒有篩選支援,遊戲效能會降低,導致終端使用者的遊戲體驗不佳。
在未來的 Windows 版本中,除了遊戲之外,還有更廣泛的應用程式用途。
BypassIO 是每個句柄概念。 當要求 BypassIO 時,它會用於明確的檔案句柄。 BypassIO 不會影響該檔案的其他句柄。
FSCTL_MANAGE_BYPASS_IO 和對等 IOCTL_STORAGE_MANAGE_BYPASS_IO 已新增為此基礎結構的一部分。 迷你篩選程式程式 FSCTL_MANAGE_BYPASS_IO,而 檔系統會將IOCTL_STORAGE_MANAGE_BYPASS_IO 傳送至磁碟區/儲存體堆棧。 這些控制程式代碼的設計目的是可診斷:它們都會傳回驅動程式的身分識別,而該驅動程序失敗了 BypassIO 要求,以及它遭到驗證的原因。
此頁面提供文件系統篩選和儲存堆疊的架構詳細數據,以及如何在迷你篩選驅動程式中實作 BypassIO 的相關信息。 如需記憶體驅動程序專屬的 BypassIO 資訊,請參閱 BypassIO 。
BypassIO 支援的範圍
從 Windows 11 開始,支援 BypassIO,如下所示:
僅限 Windows 用戶端系統上。 未來版本將會新增伺服器系統支援。
僅在 NVMe 記憶體裝置上。 未來版本將新增其他記憶體技術的支援。
僅限在NTFS檔案系統上。 未來版本將新增其他文件系統的支援。
僅支援非快取讀取。 未來版本中將會新增非快取寫入的支援。
只有目錄或磁碟區句柄) 不支援的檔案 (支援。
BypassIO 的運作方式
在已啟用 BypassIO 的 FileHandle 上呼叫 NtReadFile 時,作業通常不會流經傳統的 I/O 堆棧,而會周遊整個文件系統堆棧、磁碟區堆疊和儲存堆棧。 相反地,作業會直接從 I/O 管理員流向 (NTFS) 檔案系統,然後流向磁碟 (classpnp) 驅動程式,然後流向 StorNVMe 驅動程式。 使用完全啟用 BypassIO 的 FileHandle:
- 系統會略過所有文件系統篩選。
- 系統會略過所有磁碟區堆疊篩選。
- 會略過磁碟驅動程式上方的所有記憶體堆疊篩選和驅動程式,以及磁碟與 StorNVMe 驅動程式之間的驅動程式。
在文件系統篩選堆疊支援 BypassIO 但磁碟區和/或儲存堆疊沒有的情況下,讀取 IO 會略過篩選堆棧,但仍會透過磁碟區和/或儲存堆棧傳送。 這種支援層級稱為部分 BypassIO。
BypassIO 的 DIS 變更和新增專案
已新增下列與篩選驅動程式相關的 DIS,以提供 BypassIO 支援:
- FltVetoBypassIo 函式
- FS_BPIO_INFLAGS 列舉值
- FS_BPIO_INFO 結構
- FS_BPIO_INPUT 結構
- FS_BPIO_OPERATIONS 列舉值
- FS_BPIO_OUTFLAGS 列舉值
- FS_BPIO_OUTPUT 結構
- FS_BPIO_RESULTS 結構
- FSCTL_MANAGE_BYPASS_IO 控件程序代碼
- FsRtlGetBypassIoOpenCount 函式
此外,下列 DIS 已變更為支援 BypassIO:
- SkipIoOpenCount 字段已新增至 FSRTL_ADVANCED_FCB_HEADER 結構。 文件系統會使用此欄位,在目前已啟用 BypassIO 的數據流上維護唯一的 FileObject 計數。 新增此欄位會增加結構大小。 從 Windows 11 開始使用的結構版本FSRTL_FCB_HEADER_V4。
其他作業對已啟用 BypassIO 的句柄的影響
在句柄上啟用 BypassIO 不會影響其他句柄。 不過,啟用 BypassIO 之句柄上的其他作業會影響使用 BypassIO,例如在下列案例中:
如果您已開啟 [處理 A] 開啟至已啟用 BypassIO 且正常運作的檔案,而有人 (例如,另一個線程或進程) 開啟句柄 B 來執行快取或記憶體對應的 IO,則 BypassIO 會在句柄 A 上暫時暫停,直到句柄 B 關閉為止。 系統會改用傳統的 I/O 路徑,以確保不會發生過時的數據。 系統會繼續使用該句柄上的傳統 I/O 路徑,直到所有數據區段和快取對應損毀為止,因此篩選條件必須關閉句柄的檔案,略過IO 才能繼續。
如果已啟用 BypassIO 的檔案標示為疏鬆,則所有 BypassIO 作業都會開始使用傳統的 I/O 路徑。
將已啟用 BypassIO 的檔案解除凍結會導致所有 BypassIO 作業使用傳統的 I/O 路徑。 完成反常數之後,系統會切換回該句柄上的 BypassIO 路徑。
在迷你篩選器中實作 BypassIO 支援
更新 INF 或 MANIFEST 檔案
從 Windows 11 開始,篩選開發人員應該將SUPPORTED_FS_FEATURES_BYPASS_IO新增至驅動程式 INF 或 MANIFEST 檔案中的 SupportedFeatures。 (您可以輸入 fltmc instances
提升許可權的命令提示字元,以查看所有作用中篩選條件的 “SprtFtrs” 值。)
注意
永遠不能支援 BypassIO 的篩選仍應該將 SUPPORTED_FS_FEATURES_BYPASS_IO 新增至其 SupportedFeatures 狀態,然後適當地在篩選內指定原因。
建議使用迷你篩選,盡可能將 Vetoing BypassIO 降到最低。
如果迷你篩選附加至已啟用 BypassIO 的磁碟區,但該迷你篩選程式尚未更新其 SupportedFeatures 設定以包含 SUPPORTED_FS_FEATURES_BYPASS_IO,該磁碟區上的所有 BypassIO 作業都會立即遭到封鎖,並回復到傳統 I/O 路徑,導致遊戲效能降低。
未篩選IRP_MJ_READ或IRP_MJ_WRITE的迷你篩選會自動加入 BypassIO 支援,就像已在 SupportedFeatures 中新增SUPPORTED_FS_FEATURES_BYPASS_IO一樣。
如果堆疊上有未加入附加的迷你篩選器, FS_BPIO_OP_ENABLE 和 FS_BPIO_OP_QUERY 作業就會失敗。
實作 BypassIO 要求的支援
迷你篩選應該新增 BypassIO 要求的支援,這些要求會透過 FSCTL_MANAGE_BYPASS_IO 控件程式代碼傳送。 如需詳細資訊,請參閱 支援 BypassIO 作業 。
判斷 BypassIO 是否正常運作
已新增 fsutil 命令,以發出指定FS_BPIO_OP_QUERY作業FSCTL_MANAGE_BYPASS_IO。 顯示的結果會識別防止 BypassIO 的第一個驅動程式,以及原因。
> fsutil bypassIo state /v <path>
其中 <路徑> 可以是磁碟區、目錄或特定檔名,而 /v 是選擇性的詳細資訊旗標。
在此第一個範例中,假設 WOF 迷你篩選器尚未加入 BypassIO。 執行命令 fsutil bypassIo state c:\
會產生下列輸出:
BypassIo on "c:\" is not currently supported.
Status: 506 (At least one minifilter does not support bypass IO)
Driver: wof.sys
Reason: The specified minifilter does not support bypass IO.
在這裡第二個範例中,在啟用 BitLocker 的系統上執行 fsutil bypassIO state /v c:\
會導致下列輸出:
BypassIo on "c:\" is partially supported
Volume stack bypass is disabled (fvevol.sys)
Status: 495 (The specified operation is not supported while encryption is enabled on the target object)
Reason: BitLocker Drive Encryption is enabled.
Storage Type: NVMe
Storage Driver: BypassIo compatible
Driver Name: stornvme.sys
NTFS 特定行為
您可以在NTFS駐留檔案上啟用 BypassIO;不過,只要檔案是駐留的,檔案就會採用傳統的 I/O 路徑。 如果檔案發生寫入,使其不具許可權,系統會切換為使用 BypassIO 路徑。
NTFS 壓縮無法在 BypassIO 使用中檔案上啟用。
NTFS 加密可以在 BypassIO 使用中檔案上啟用。 BypassIO 已暫停。
BypassIO 不會影響卸除讀取/寫入作業。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應