DMA 리소스 예약

[KMDF에만 적용]

일반적으로 프레임워크 기반 드라이버는 미리 맵 레지스터를 예약하지 않습니다. 그러나 특정 상황에서는 드라이버가 이러한 리소스를 미리 예약해야 할 수 있습니다.

Windows 8 이상에서 실행되는 프레임워크 기반 드라이버는 패킷 또는 시스템 프로필을 지정하는 DMA 인에이블러에 대해 지정된 수의 맵 레지스터를 예약할 수 있습니다. 이를 위해 드라이버는 WdfDmaTransactionAllocateResources 를 호출하고 EvtReserveDma 콜백 함수를 등록합니다.

프레임워크는 맵 레지스터 및 WDM DMA 어댑터의 잠금을 예약한 경우 드라이버의 EvtReserveDma 함수를 호출합니다. 그런 다음 드라이버는 트랜잭션 개체를 마지막으로 해제하기 전에 동일한 트랜잭션 개체를 사용하여 트랜잭션을 여러 번 초기화하고 시작할 수 있습니다. DMA 리소스를 시스템에 다시 릴리스하기 위해 드라이버는 WdfDmaTransactionFreeResources를 호출합니다.

트랜잭션에 필요한 맵 레지스터 수를 확인하기 위해 드라이버는 WdfDmaTransactionAllocateResources 를 호출하기 전에 WdfDmaTransactionGetTransferInfo를 호출할 수 있습니다. 드라이버는 WdfDmaTransactionGetTransferInfo를 호출하기 전에 트랜잭션을 초기화해야 합니다.

다음 단계에서는 드라이버가 지정된 트랜잭션에서 단독으로 사용하기 위해 DMA 인에이블러를 예약하고 해제하는 방법을 보여 줍니다.

  1. 드라이버는 I/O 요청을 받습니다.

  2. 드라이버의 요청 처리기는WdfDmaTransactionCreate 를 호출하여 요청에 대한 DMA 트랜잭션 개체를 만듭니다.

  3. 드라이버의 요청 처리기는WdfDmaTransactionAllocateResources 를 호출하여 리소스를 예약합니다.

  4. 프레임워크는 요청된 리소스를 예약한 경우 EvtReserveDma 를 호출합니다.

  5. EvtReserveDma에서 드라이버는 WdfDmaTransactionInitializeUsingRequest 또는 WdfDmaTransactionInitialize를 호출하여 트랜잭션 개체를 초기화합니다.

  6. EvtReserveDma에서 드라이버는 WdfDmaTransactionExecute 메서드를 호출하여 트랜잭션을 시작합니다. 트랜잭션에 예약된 리소스가 있으므로 프레임워크는 드라이버의 EvtProgramDma 콜백 함수를 즉시 호출합니다.

  7. EvtInterruptDpc 또는 EvtDmaTransactionDmaTransferComplete에서 드라이버는 WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength 또는 WdfDmaTransactionDmaCompletedFinal, WdfObjectDelete 또는 WdfDmaTransactionRelease를 호출합니다. 드라이버는 트랜잭션이 완료되거나 취소될 때까지 트랜잭션을 삭제하거나 해제해서는 안됩니다. 이 단계가 완료되면 맵 레지스터가 예약된 상태로 유지됩니다.

  8. 드라이버는 필요한 만큼 5~7단계를 반복할 수 있습니다.

    드라이버에 더 이상 예약이 필요하지 않은 경우 드라이버는 EvtInterruptDpc 또는 EvtDmaTransactionDmaTransferComplete에서 WdfDmaTransactionFreeResources를 호출합니다. 또는 드라이버가 EvtReserveDma 이벤트 콜백 함수에서 WdfDmaTransactionFreeResources를 호출할 수 있습니다.