存储驱动程序中的 BypassIO

关于 BypassIO

从 Windows 11 开始,BypassIO 已添加为用于从文件读取的优化 I/O 路径。 此路径的目标是减少执行读取的 CPU 开销,这有助于满足在 Windows 上加载和运行下一代游戏的 I/O 要求。 BypassIO 是支持 Windows 上的 DirectStorage 的基础结构的一部分。

存储驱动程序必须实现对 BypassIO 的支持,并尽可能多地启用 BypassIO。 如果没有存储堆栈支持,游戏性能会下降,从而导致最终用户的游戏体验不佳。

在将来的 Windows 版本中,除了游戏之外,还有更广泛的应用程序用途。

IOCTL_STORAGE_MANAGE_BYPASS_IO 和等效 FSCTL_MANAGE_BYPASS_IO 已添加为此基础结构的一部分。 IOCTL_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 for 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