Share via


Administración de métodos de acceso de búfer en controladores UMDF

Si va a escribir un controlador UMDF, puede especificar las preferencias para el método de acceso al búfer que usa el marco para las solicitudes de lectura y escritura, así como las solicitudes de control de E/S del dispositivo. Los valores que proporciona un controlador UMDF solo son preferencias y no se garantiza que lo use el marco.

Especificar un método de acceso de búfer preferido

A partir de la versión 2.0 de UMDF, un controlador UMDF llama a WdfDeviceInitSetIoTypeEx para registrar métodos de acceso preferidos para las solicitudes de lectura y escritura y para las solicitudes de control de E/S del dispositivo.

Si el controlador no llama a WdfDeviceInitSetIoTypeEx, UMDF usa el método almacenado en búfer para las solicitudes de E/S a este dispositivo.

El marco de trabajo usa las siguientes reglas para determinar qué método de acceso se va a usar:

  • Todos los controladores UMDF de una pila de controladores deben usar el mismo método para acceder a los búferes de un dispositivo y el marco da preferencia a la E/S almacenada en búfer.

    Si UMDF determina que algunos controladores prefieren E/S almacenada en búfer o E/S directa para un dispositivo, mientras que otros controladores prefieren solo E/S almacenada en búfer para el dispositivo, UMDF usa E/S almacenada en búfer para todos los controladores. Si uno o varios de los controladores de una pila prefieren solo E/S almacenada en búfer, mientras que otros prefieren solo E/S directa, UMDF registra un evento en el registro de eventos del sistema y no inicia la pila de controladores.

    El controlador puede llamar a WdfDeviceGetDeviceStackIoType para determinar los métodos de acceso del búfer asignados a las solicitudes de lectura y escritura de un dispositivo y las solicitudes de control de E/S.

  • En algunos casos, UMDF asigna E/S directa a un dispositivo, pero para obtener el mejor rendimiento, usa E/S almacenada en búfer para una o varias de las solicitudes del dispositivo. Por ejemplo, UMDF usa E/S almacenada en búfer para búferes pequeños si puede copiar los datos en el búfer del controlador más rápido de lo que puede asignar los búferes para el acceso directo.

    Opcionalmente, el controlador puede proporcionar un valor DirectTransferThreshold cuando llama a WdfDeviceInitSetIoTypeEx. El marco usa este valor para determinar el tamaño de búfer más pequeño para el que el marco usará E/S directa. Normalmente, no es necesario proporcionar este valor porque el marco usa la configuración que proporciona el mejor rendimiento.

  • UMDF usa E/S directa solo para el espacio de búfer que comienza y termina en un límite de página de memoria. Si el principio o el final de un búfer no se encuentran en un límite de página, UMDF usa E/S almacenada en búfer para esa parte del búfer. En otras palabras, UMDF podría usar E/S almacenada en búfer y E/S directa para una transferencia de datos grande que consta de varias solicitudes de E/S.

  • En el caso de las solicitudes de control de E/S de dispositivo, UMDF usa E/S directa solo si el código de control de E/S (IOCTL) especifica E/S directa y solo si todos los controladores UMDF de ese dispositivo han llamado a WdfDeviceInitSetIoTypeEx para especificar el método de acceso directo.

Recuperar el método de acceso para una solicitud de E/S

Los controladores usan el mismo conjunto de métodos de objeto de solicitud para acceder a los búferes de datos, independientemente del método de acceso al búfer. Por lo tanto, la mayoría de los controladores normalmente no necesitan saber si UMDF usa E/S almacenada en búfer o E/S directa para una solicitud de E/S.

En algunos casos, puede mejorar el rendimiento de un controlador si conoce el método de acceso de una solicitud de E/S. Por ejemplo, considere un dispositivo de alto rendimiento que normalmente usa E/S directa. Cuando el controlador recibe una solicitud de E/S, copia los datos del espacio de búfer compartido en la memoria del controlador local para la validación.

Sin embargo, el controlador puede recibir ocasionalmente un búfer que usa E/S almacenada en búfer. Dado que el administrador de E/S ya ha copiado estos datos en un búfer intermedio, el controlador no necesita copiar los parámetros localmente. Al evitar la operación de copia, el controlador mejora el rendimiento.

Un controlador UMDF llama a WdfRequestGetEffectiveIoType para obtener el método de acceso al búfer de una solicitud de E/S. Como se ha descrito anteriormente, el tipo de E/S para una solicitud específica puede diferir de la configuración de tipo de E/S asignada por el marco para un dispositivo.

Conversión de E/S almacenada en búfer ni E/S directa

Un controlador UMDF no puede usar el método "ninguno".

Sin embargo, las definiciones de algunos códigos de control de E/S de dispositivo (IOCTLs) especifican que las solicitudes usan el método "ninguno". Opcionalmente, un controlador UMDF puede convertir el método de acceso del búfer de estas solicitudes de control de E/S de dispositivo a E/S almacenadas en búfer o E/S directa. Siga estos pasos:

  1. Incluya la directiva UmdfMethodNeitherAction en una sección INF DDInstall del archivo INF del controlador. Puede establecer el valor de la directiva para indicar que UMDF debe pasar solicitudes de control de E/S de dispositivo que usan el método de acceso "ninguno" al controlador. (De lo contrario, UMDF completa estas solicitudes de E/S con un valor de estado de error).

  2. Acceda a los búferes de la solicitud de E/S mediante los métodos de objeto que UMDF proporciona para E/S almacenada en búfer o E/S directa.

Debe habilitar la compatibilidad con las solicitudes IOCTL que usan el método "ninguno" solo si está seguro de que UMDF puede convertir el método de acceso a E/S almacenada en búfer o E/S directa. Por ejemplo, si el IOCTL especifica una solicitud personalizada que no sigue las reglas de especificación del búfer que se describen en Descripciones del búfer para códigos de control de E/S, UMDF no puede convertir los búferes.