Uso de E/S directa con DMA

En la ilustración siguiente se muestra cómo el administrador de E/S configura una solicitud de IRP_MJ_READ para una operación de transferencia DMA que usa E/S directa.

diagrama que ilustra la E/S directa en los búferes de usuario para dispositivos que usan dma.

En la ilustración anterior se muestra cómo los controladores pueden usar mdlAddress del IRP para transferir datos para una solicitud de lectura. El controlador de la ilustración usa el sistema basado en paquetes o DMA de bus-master y tiene ORed las marcas del objeto de dispositivo con DO_DIRECT_IO.

  1. Algunos intervalos de direcciones virtuales de espacio de usuario representan el búfer del subproceso actual y el contenido del búfer podría almacenarse realmente en algún número de páginas físicamente desconcertantes (sombreado oscuro en la ilustración anterior). El administrador de E/S crea una MDL para describir este búfer. Un MDL es una estructura de datos opaca, definida por el administrador de memoria, que asigna un intervalo de direcciones virtuales determinado a uno o varios intervalos de direcciones físicas basados en páginas. Para obtener más información, consulte Uso de MDL.

  2. El administrador de E/S atiende la solicitud de lectura del subproceso actual, para la que el subproceso pasa un intervalo de direcciones virtuales de espacio de usuario que representan un búfer.

  3. El administrador de E/S o el controlador del sistema de archivos (FSD) comprueba el búfer proporcionado por el usuario para obtener accesibilidad y llama a MmProbeAndLockPages con la MDL creada anteriormente. MmProbeAndLockPages también rellena el intervalo de direcciones físicos correspondiente en MDL.

    Como se muestra en la ilustración anterior, un MDL para un intervalo virtual puede tener varias entradas de dirección física basadas en páginas correspondientes, y el intervalo virtual de un búfer podría comenzar y terminar en algún desplazamiento de bytes desde el principio de las primeras y últimas páginas descritas por una MDL.

  4. El administrador de E/S proporciona un puntero a MDL (MdlAddress) en un IRP que solicita una operación de transferencia. Hasta que el administrador de E/S o el sistema de archivos llame a MmUnlockPages después de que el controlador complete el IRP, las páginas físicas descritas en MDL permanecen bloqueadas y asignadas al búfer. Sin embargo, las direcciones virtuales de este tipo de MDL pueden ser invisibles (y no válidas), incluso antes de que el IRP se envíe al controlador del dispositivo o a cualquier controlador intermedio que pueda estar superpuesta por encima del controlador de dispositivo.

  5. Si el controlador usa el sistema basado en paquetes o DMA de bus-master, su rutina AdapterControl llama a MmGetMdlVirtualAddress con el puntero MdlAddress del IRP para obtener la dirección virtual base para las entradas basadas en páginas de MDL.

  6. A continuación, la rutina AdapterControl llama a MapTransfer con la dirección base devuelta por MmGetMdlVirtualAddress, para leer datos del dispositivo directamente en la memoria física. (Para obtener más información, vea Objetos de adaptador y DMA).

Los controladores siempre deben comprobar las longitudes del búfer. Tenga en cuenta que el administrador de E/S no crea un MDL para un búfer de longitud cero.