BypassIO para controladores de filtro
Acerca de BypassIO
La característica BypassIO ofrece una ruta de acceso de E/S optimizada para leer archivos. El objetivo de esta ruta es reducir la sobrecarga de la CPU al realizar lecturas, lo que ayuda a satisfacer las demandas de E/S de la carga y ejecución de juegos de última generación en Windows. BypassIO forma parte de la infraestructura para admitir DirectStorage en Windows. Está disponible a partir de Windows 11.
Es importante que los minifiltros implementen compatibilidad con BypassIO, y que mantenga BypassIO habilitado tanto como sea posible. Sin compatibilidad con el filtro, el rendimiento de los juegos se degrada, lo que se traduce en una mala experiencia de juego para los usuarios finales.
En futuras versiones de Windows habrá usos más amplios de las aplicaciones, además de los juegos.
BypassIO es un concepto por identificador. Cuando se solicita BypassIO, es para un identificador de archivo explícito. BypassIO no tiene ningún efecto en otros identificadores para ese archivo.
FSCTL_MANAGE_BYPASS_IO y su equivalente IOCTL_STORAGE_MANAGE_BYPASS_IO se añadieron como parte de esta infraestructura. Los minifiltros procesan FSCTL_MANAGE_BYPASS_IO, mientras que IOCTL_STORAGE_MANAGE_BYPASS_IO lo envían los sistemas de archivos a las pilas de volumen/almacenamiento. Estos códigos de control están diseñados para ser diagnosticables: ambos devuelven la identidad del controlador que falló la solicitud BypassIO, y la razón para vetarla.
En esta página se proporcionan detalles de arquitectura en los filtros del sistema de archivos y las pilas de almacenamiento, así como información sobre cómo implementar BypassIO en un controlador de minifiltro. Consulte BypassIO para controladores de almacenamiento para obtener información de BypassIO específica de los controladores de almacenamiento.
Ámbito de compatibilidad con BypassIO
A partir de Windows 11, BypassIO es compatible de la siguiente manera:
Solo en sistemas cliente Windows. La compatibilidad con sistemas de servidor se añadirá en una versión futura.
Solo en dispositivos de almacenamiento NVMe. La compatibilidad con otras tecnologías de almacenamiento se añadirá en una futura versión.
Solo en el sistema de archivos NTFS. La compatibilidad con otros sistemas de archivos se añadirá en una futura versión.
Solo se admiten lecturas sin almacenamiento en caché. La compatibilidad con escrituras no almacenadas en caché se añadirá en una futura versión.
Solo es compatible con archivos (no es compatible con gestores de directorio o volumen).
Funcionamiento de BypassIO
Cuando se llama a NtReadFile en un FileHandle habilitado para BypassIO, la operación normalmente no fluye a través de la pila de E/S tradicional, que atraviesa toda la pila del sistema de archivos, la pila de volúmenes y la pila de almacenamiento. En su lugar, la operación fluye directamente desde el administrador de E/S al sistema de archivos (NTFS), luego al controlador de disco (classpnp) y, a continuación, al controlador StorNVMe. Con un FileHandle totalmente habilitado para BypassIO:
- Se omiten todos los filtros del sistema de archivos.
- Se omiten todos los filtros de pila de volúmenes.
- Se omiten todos los filtros y controladores de la pila de almacenamiento situados encima del controlador de disco, y entre los controladores de disco y StorNVMe.
En escenarios en los que la pila de filtros del sistema de archivos admite BypassIO, pero el volumen o la pila de almacenamiento no:
- Las E/S de lectura omiten la pila de filtros.
- Las E/S de lectura se siguen enviando a través de la pila de volumen o almacenamiento.
Este nivel de compatibilidad se conoce como BypassIO parcial.
Cambios y adiciones de DDI para BypassIO
Las siguientes DDI relevantes para los controladores de filtro se han agregado para proveer compatibilidad con BypassIO:
- Función FltVetoBypassIo
- Enumerador BPIO_INFLAGS
- Estructura FS_BPIO_INFO
- Estructura FS_BPIO_INPUT
- Enumerador FS_BPIO_OPERATIONS
- Enumerador FS_BPIO_OUTFLAGS
- Estructura FS_BPIO_OUTPUT
- Estructura FS_BPIO_RESULTS
- Código de control FSCTL_MANAGE_BYPASS_IO
- Función FsRtlGetBypassIoOpenCount
Además, se cambiaron las siguientes DDI para admitir BypassIO:
- Se agregó un campo BypassIoOpenCount a la estructura FSRTL_ADVANCED_FCB_HEADER. El sistema de archivos usa este campo para mantener un recuento de FileObjects únicos en una secuencia que actualmente tiene BypassIO habilitado. La adición de este campo aumenta el tamaño de la estructura. La versión de la estructura que se usará a partir de Windows 11 es FSRTL_FCB_HEADER_V4.
Efecto de otras operaciones en identificadores habilitados para BypassIO
La habilitación de BypassIO en un identificador no afecta a otros identificadores. Sin embargo, otras operaciones en un identificador habilitado para BypassIO afectan al uso de BypassIO, como en los escenarios siguientes:
Si tiene el identificador A abierto a un archivo en el que BypassIO está habilitado y funcionando, y alguien (por ejemplo, otro subproceso o proceso) abre el identificador B para realizar E/S asignadas en caché o memoria, BypassIO se suspende temporalmente en el identificador A hasta que se cierra el identificador B. En su lugar, el sistema usa la ruta de acceso de E/S tradicional para garantizar que no se produzcan datos obsoletos. El sistema sigue usando la ruta de acceso de E/S tradicional en ese identificador hasta que se descompongan todas las secciones de datos y los mapas de caché. Como resultado, los filtros deben cerrar el archivo del identificador antes de que BypassIO pueda reanudarse.
Si un archivo habilitado para BypassIO está marcado como disperso, todas las operaciones BypassIO comienzan a usar la ruta de acceso de E/S tradicional.
La desfragmentación de un archivo habilitado para BypassIO hace que todas las operaciones de BypassIO usen la ruta de acceso de E/S tradicional. Una vez completada la desfragmentación, el sistema vuelve a la ruta de acceso BypassIO en ese identificador.
Implementación de la compatibilidad con BypassIO en minifiltros
Actualización de los archivos INF o MANIFEST
A partir de Windows 11, los desarrolladores de filtros deben agregar SUPPORTED_FS_FEATURES_BYPASS_IO a SupportedFeatures en los archivos INF o MANIFEST del controlador. (Puede escribir fltmc instances
en un símbolo del sistema con privilegios elevados para ver los valores de "SprtFtrs" para todos los filtros activos).
Nota:
Un filtro que nunca puede admitir BypassIO puede seguir agregando SUPPORTED_FS_FEATURES_BYPASS_IO a su estado SupportedFeatures y, a continuación, vetar adecuadamente dentro del filtro, especificando el motivo.
Se recomienda que los minifiltros minimicen al máximo el veto a BypassIO.
Si un minifiltro se asocia a un volumen en el que está habilitado BypassIO, pero ese minifiltro no ha actualizado su configuración de SupportedFeatures para incluir SUPPORTED_FS_FEATURES_BYPASS_IO, todas las operaciones de BypassIO en ese volumen se bloquean inmediatamente, volviendo a la ruta de acceso de E/S tradicional, lo que da lugar a un rendimiento degradado del juego.
Los minifiltros que no filtran IRP_MJ_READ o IRP_MJ_WRITE se incluyen automáticamente en la compatibilidad con BypassIO, como si hubieran agregado SUPPORTED_FS_FEATURES_BYPASS_IO a SupportedFeatures.
Las operaciones FS_BPIO_OP_ENABLE y FS_BPIO_OP_QUERY producen un error en una pila si hay un minifiltro adjunto que no participa.
Implementación de la compatibilidad con solicitudes BypassIO
Los minifiltros deben agregar compatibilidad con las solicitudes BypassIO, que se envían a través del código de control FSCTL_MANAGE_BYPASS_IO. Consulte Compatibilidad con operaciones de BypassIO para obtener más información.
Determinación de si BypassIO funciona
Un comando fsutil agregado emite un FSCTL_MANAGE_BYPASS_IO especificando la operación FS_BPIO_OP_QUERY. Los resultados mostrados identifican el primer controlador que impide BypassIO y el motivo.
> fsutil bypassIo state /v <path>
Donde la <ruta de acceso> puede ser un volumen, un directorio o un nombre de archivo específico, y /v es una marca detallada opcional.
En este primer ejemplo, supongamos que el minifiltro WOF no ha optado por BypassIO. La ejecución del comando fsutil bypassIo state c:\
da como resultado el siguiente resultado:
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.
En este segundo ejemplo, la ejecución de fsutil bypassIO state /v c:\
en un sistema en el que BitLocker está habilitado da como resultado la siguiente salida:
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
Comportamiento específico de NTFS
BypassIO se puede habilitar en un archivo residente NTFS; sin embargo, el archivo toma la ruta de acceso de E/S tradicional siempre que sea residente. Si se produce una escritura en el archivo de forma que pase a ser no residente, el sistema pasa a utilizar la ruta BypassIO.
La compresión NTFS no se puede habilitar en un archivo activo BypassIO.
El cifrado NTFS se puede habilitar en un archivo activo BypassIO. BypassIO se pausa.
BypassIO no afecta a las operaciones de lectura y escritura de descarga.