Uso de E/S directa
Los controladores para dispositivos que pueden transferir grandes cantidades de datos a la vez deben usar E/S directa para esas transferencias. El uso de E/S directa para transferencias grandes mejora el rendimiento de un controlador, ya que reduce su sobrecarga de interrupción y elimina las operaciones de asignación de memoria y copia inherentes a la E/S almacenada en búfer.
Por lo general, los controladores de dispositivos de almacenamiento masivo solicitan E/S directa para las solicitudes de transferencia, incluidos los controladores de nivel más bajo que usan el acceso directo a la memoria (DMA) o la E/S programada (PIO), así como los controladores intermedios encadenados por encima de ellos.
El administrador de E/S determina que una operación de E/S usa E/S directa como se indica a continuación:
Para las solicitudes IRP_MJ_READ y IRP_MJ_WRITE , DO_DIRECT_IO se establece en el miembro Flags de la estructura DEVICE_OBJECT . Para obtener más información, consulte Inicialización de un objeto device.
Para las solicitudes de IRP_MJ_DEVICE_CONTROL y IRP_MJ_INTERNAL_DEVICE_CONTROL , el valor del código IOCTL contiene METHOD_IN_DIRECT o METHOD_OUT_DIRECT como valor TransferType en el valor IOCTL. Para obtener más información, consulte Definición de códigos de control de E/S.
Los controladores que usan E/S directa a veces también usarán E/S almacenada en búfer para controlar algunos IRP. En concreto, los controladores suelen usar E/S almacenada en búfer para algunos códigos de control de E/S para IRP_MJ_DEVICE_CONTROL solicitudes que requieren transferencias de datos, independientemente de si el controlador usa E/S directa para las operaciones de lectura y escritura.
La configuración de una transferencia directa de E/S varía ligeramente, en función de si se usa DMA o PIO. Para más información, consulte:
Los controladores deben tomar medidas para mantener la coherencia de caché durante las transferencias de DMA y PIO. Para obtener más información, consulte Mantener la coherencia de caché.