Versión 3 de la interfaz de operaciones DMA
La versión 3 de la interfaz de operaciones DMA está disponible a partir de Windows 8. La estructura DMA_OPERATIONS para esta interfaz contiene varias rutinas nuevas que no están definidas en versiones anteriores de esta interfaz. Para obtener una lista de las rutinas de la versión 3, consulte DMA_OPERATIONS.
Aunque la versión 3 de la interfaz de operaciones DMA está disponible en todas las plataformas de hardware de Windows, esta interfaz tiene muchas características para permitir que los controladores en modo kernel usen las funcionalidades avanzadas de los controladores DMA del sistema en circuitos integrados del sistema en un chip (SoC). Estas funcionalidades suelen incluir la capacidad de realizar transferencias DMA de dispersión o recopilación. En cambio, las versiones anteriores de la interfaz de operaciones DMA restringen las transferencias de dispersión y recopilación de DMA a los dispositivos maestros de bus. La interfaz version-3 simplifica la administración de listas de dispersión y recopilación y reduce la necesidad de intervención del controlador durante transferencias DMA complejas.
Para usar la versión 3 de la interfaz de operaciones DMA para realizar una transferencia DMA, un controlador normalmente llama a las rutinas siguientes:
IoGetDmaAdapter
Asigna un objeto de adaptador DMA y devuelve un puntero a una estructura de DMA_ADAPTER que contiene la interfaz de operaciones DMA.
GetDmaTransferInfo
Proporciona una descripción de los recursos necesarios para realizar la transferencia DMA descrita por el autor de la llamada.
AllocateAdapterChannelEx
Asigna los recursos necesarios para la transferencia DMA y asigna estos recursos al objeto de adaptador DMA.
MapTransferEx
Inicializa los registros de mapa y el búfer de dispersión y recopilación para la transferencia DMA e inicia la transferencia.
FlushAdapterBuffersEx
Realiza cualquier operación de caché que pueda ser necesaria al final de la transferencia DMA.
FreeAdapterChannel
Libera el canal DMA y los registros de mapa.
PutDmaAdapter
Libera el objeto de adaptador.
Estas rutinas se usan tanto para dispositivos maestros de bus que usan controladores DMA dedicados como para dispositivos subordinados que comparten un controlador DMA del sistema. Para obtener una descripción paso a paso de las llamadas que realiza un controlador durante una transferencia de DMA típica, consulte Patrón de llamada básico para rutinas DMA de la versión 3.
Nota En la versión 3 de la interfaz de operaciones DMA, las llamadas a la rutina KeFlushIoBuffers no son necesarias antes o después de las transferencias de DMA. El motivo es que las siguientes rutinas cubren la necesidad de vaciar cachés de datos en plataformas que no aplican la coherencia de caché en el hardware:
- MapTransferEx garantiza que las memorias caché de datos del procesador se vacían antes de las transferencias de escritura (memoria a dispositivo).
- FlushAdapterBuffersEx garantiza que las memorias caché se invaliden después de las transferencias de lectura (dispositivo a memoria).
En un procesador x86 o x64, la llamada a KeFlushIoBuffers no realiza ninguna operación y esta llamada, aunque no es innecesaria, no interfiere con el funcionamiento de la plataforma de hardware. En un procesador Arm, las llamadas a KeFlushIoBuffers durante las transferencias de DMA realizan operaciones de caché innecesarias y pueden degradar el rendimiento.