存储驱动程序中的 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_IOIOCTL_STORAGE_MANAGE_BYPASS_IO 由文件系统发送到卷/存储堆栈,而微筛选器会处理 FSCTL_MANAGE_BYPASS_IO。 根据设计,这些控制代码可诊断:它们都返回导致 BypassIO 请求失败的驱动程序的标识,以及否决它的原因。

请参阅筛选器驱动程序中的 BypassIO,了解文件系统筛选器和存储堆栈中的 BypassIO 系统体系结构详细信息。

BypassIO 支持的范围

从 Windows 11 开始,支持 BypassIO,如下所示:

  • 仅在 Windows 客户端系统上。 将在未来版本中将添加服务器系统支持。

  • 仅在 NVMe 存储设备上。 将来的版本中将添加对其他存储技术的支持。

  • 仅在 NTFS 文件系统上。 将来的版本中将添加对其他文件系统的支持。

  • 仅支持非缓存读取。 将在未来版本中添加对非缓存写入的支持。

  • 仅在文件上受支持(目录或卷句柄不支持)。

BypassIO 的 DDI 更改和添加

添加了以下与存储驱动程序相关的 DDI,以提供 BypassIO 支持:

存储堆栈驱动程序需要执行哪些操作来支持 BypassIO

从 Windows 11 开始,存储驱动程序开发人员需要更新其驱动程序的 INF 或 MANIFEST 文件,以使用 STORAGE_SUPPORTED_FEATURES_BYPASS_IO 为 BypassIO 添加 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