Compartir a través de


Reserva de recursos de DMA

[Solo se aplica a KMDF]

Normalmente, los controladores basados en marcos no reservan registros de asignación con antelación. Sin embargo, en determinadas circunstancias, es posible que los conductores deba reservar estos recursos con antelación.

Los controladores basados en marcos que se ejecutan en Windows 8 o versiones posteriores pueden reservar un número especificado de registros de mapa para un habilitador DMA que especifique un paquete o perfil del sistema. Para ello, el controlador llama a WdfDmaTransactionAllocateResources y registra una función de devolución de llamada EvtReserveDma .

El marco llama a la función EvtReserveDma del controlador cuando ha reservado los registros de mapa y el bloqueo del adaptador DMA de WDM. Después, el controlador puede inicializar e iniciar la transacción varias veces con el mismo objeto de transacción antes de liberar el objeto de transacción. Para volver a liberar los recursos de DMA en el sistema, el controlador llama a WdfDmaTransactionFreeResources.

Para determinar el número de registros de mapa necesarios para una transacción, el controlador puede llamar a WdfDmaTransactionGetTransferInfo antes de llamar a WdfDmaTransactionAllocateResources. El controlador debe inicializar la transacción antes de llamar a WdfDmaTransactionGetTransferInfo.

En los pasos siguientes se muestra cómo un controlador puede reservar y liberar un habilitador DMA para uso exclusivo con una transacción especificada:

  1. El controlador recibe una solicitud de E/S.

  2. El controlador de solicitudes del controlador llama a WdfDmaTransactionCreate para crear un objeto de transacción DMA para la solicitud.

  3. El controlador de solicitudes del controlador llama a WdfDmaTransactionAllocateResources para reservar recursos.

  4. El marco llama a EvtReserveDma cuando ha reservado los recursos solicitados.

  5. En EvtReserveDma, el controlador llama a WdfDmaTransactionInitializeUsingRequest o WdfDmaTransactionInitialize para inicializar el objeto de transacción.

  6. En EvtReserveDma, el controlador llama al método WdfDmaTransactionExecute para iniciar la transacción. Dado que la transacción tiene recursos reservados, el marco llama inmediatamente a la función de devolución de llamada EvtProgramDma del controlador.

  7. Desde EvtInterruptDpc o EvtDmaTransactionDmaTransferComplete, el controlador llama a WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength o WdfDmaTransactionDmaCompletedFinal, seguido de WdfObjectDelete o WdfDmaTransactionRelease. El controlador no debe eliminar ni liberar la transacción hasta que la transacción se haya completado o cancelado. Después de completar este paso, los registros de mapa permanecen reservados.

  8. El controlador puede repetir los pasos del 5 al 7 tantas veces como sea necesario.

    Cuando el controlador ya no necesita la reserva, el controlador llama a WdfDmaTransactionFreeResources desde EvtInterruptDpc o EvtDmaTransactionDmaTransferComplete. Como alternativa, el controlador puede llamar a WdfDmaTransactionFreeResources desde su función de devolución de llamada de evento EvtReserveDma .