Compartir a través de


Uso de Packet-Based Bus-Master DMA

Para usar DMA basado en paquetes, los controladores de los dispositivos DMA maestros de bus llaman a la siguiente secuencia general de rutinas de soporte técnico a medida que procesan un IRP que solicita una transferencia DMA:

  • KeFlushIoBuffers justo antes de intentar asignar registros de mapa para una solicitud de transferencia (para obtener más información, vea Mantener la coherencia de caché).

  • AllocateAdapterChannel cuando el controlador está listo para programar el adaptador de bus-master para DMA

  • MmGetMdlVirtualAddress para obtener un índice en MDL, necesario como parámetro inicial para MapTransfer y MapTransfer para hacer que la memoria física del sistema que respalda el búfer de IRP accesible para el dispositivo

    Tenga en cuenta que cualquier controlador puede necesitar llevar a cabo más de una operación de transferencia para satisfacer el IRP actual, como se explica en División de solicitudes de transferencia. Los controladores de dispositivos que no tienen funcionalidades de dispersión y recopilación pueden llamar a MapTransfer una vez por operación de transferencia. Los controladores de dispositivos que tienen funcionalidades de dispersión y recopilación pueden llamar a MapTransfer más de una vez para configurar cada operación de transferencia. Como alternativa, estos controladores pueden usar la compatibilidad integrada de dispersión y recopilación del sistema, que se describe en Uso de Dispersión/Recopilación de DMA.

  • FlushAdapterBuffers al final de cada operación de transferencia de DMA hacia y desde el dispositivo de destino, para determinar si todos los datos solicitados se han transferido por completo.

  • FreeMapRegisters se realiza en cuanto se realizan todas las operaciones de DMA para el IRP actual, ya que todos los datos solicitados se han transferido completamente o porque el controlador debe producir un error irP debido a un error de E/S de dispositivo o bus

El puntero de objeto de adaptador devuelto por IoGetDmaAdapter es un parámetro obligatorio para AllocateAdapterChannel, MapTransfer, FlushAdapterBuffers y FreeMapRegisters. Tenga en cuenta que en versiones de Windows NT anteriores a Windows 2000, los dispositivos maestros de bus podrían pasar un puntero de objeto de adaptador NULL a MapTransfer y FlushAdapterBuffers. En Windows 2000 y versiones posteriores, los controladores ya no pueden hacerlo.

KeFlushIoBuffers y MmGetMdlVirtualAddress requieren un puntero al MDL en Irp-MdlAddress>.

Los controladores individuales llaman a esta secuencia de rutinas de soporte técnico en distintos puntos, en función de cómo se implemente cada controlador para atender su dispositivo. Por ejemplo, la rutina StartIo de un controlador podría realizar la llamada a AllocateAdapterChannel, mientras que otro controlador podría realizar esta llamada de una rutina que quita irP de una cola interbloqueada creada por el controlador o una cola de dispositivos.

En lugar de usar las rutinas descritas en esta sección, cualquier controlador que use DMA basado en paquetes puede usar rutinas de soporte técnico diseñadas para simplificar la dispersión y recopilación de DMA, independientemente de si su dispositivo tiene compatibilidad integrada de dispersión o recopilación. Consulte Uso de dispersión y recopilación de DMA para obtener más información.