다음을 통해 공유


단일 전송 DMA 사용

기본적으로 WDF는 경우에 따라 단일 DMA 트랜잭션을 여러 DMA 전송으로 분할합니다. 그러나 일부 디바이스는 조각난 트랜잭션을 처리할 수 없으며 대신 단일 DMA 작업에서 모든 데이터를 수신해야 합니다. 예를 들어 일부 PCI 네트워크 컨트롤러에는 부분 데이터를 캐시하고 다시 어셈블할 하드웨어가 없기 때문에 한 번에 하나의 네트워크 패킷이 필요합니다.

KMDF 버전 1.19부터 DMA v3을 사용하는 KMDF 드라이버는 단일 전송 DMA 트랜잭션이 필요하도록 지정할 수 있습니다. 드라이버는 단일 DMA 트랜잭션에 대해서만 단일 전송을 지정하거나 지정된 DMA 인에이블러를 사용하여 만든 모든 DMA 트랜잭션에 대해 단일 전송을 지정할 수 있습니다.

특정 DMA 트랜잭션에 대한 단일 전송 설정

단일 트랜잭션에 대한 단일 전송을 설정하려면 다음 시퀀스를 사용합니다.

  1. WdfDmaTransactionCreate 또는 WdfDmaTransactionRelease를 호출합니다.
  2. WdfDmaTransactionSetSingleTransferRequirement를 호출합니다.
  3. WdfDmaTransactionInitialize를 호출합니다.
    트랜잭션 조각화로 인해 초기화가 실패하면 드라이버는 I/O 요청에 실패하거나 트랜잭션의 메모리 버퍼를 다시 정렬하고 트랜잭션을 다시 초기화할 수 있습니다.
  4. WdfDmaTransactionExecute를 호출합니다.

드라이버를 디버깅할 때 !wdfkd.wdfdmatransaction 확장을 사용하여 지정된 트랜잭션 개체에 대해 단일 전송이 설정되었는지 확인할 수 있습니다.

특정 DMA 인에이블러를 사용하여 만든 모든 DMA 트랜잭션에 대한 단일 전송 요구 사항 설정

지정된 인에이블러를 사용하여 만든 모든 트랜잭션에 대해 단일 전송을 설정하려면 WdfDmaEnablerCreate를 호출할 때 WDF_DMA_ENABLER_CONFIG_FLAGS WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER플래그를 지정합니다.

이 플래그를 사용하는 드라이버는 트랜잭션 개체를 만들거나 다시 사용할 때마다 WdfDmaTransactionSetSingleTransferRequirement 를 호출할 필요가 없습니다.

드라이버가 트랜잭션 개체를 다시 사용하는 경우에도 이 설정이 유지됩니다.

디버깅할 때 !wdfkd.wdfdmaenabler 확장을 사용하여 지정된 DMA 인에이블러 개체에 대해 단일 전송이 설정되었는지 확인합니다.

WDF가 드라이버의 DMA 이벤트 콜백 함수를 호출하는 순서에 대한 자세한 내용은 Bus-Master DMA 디바이스에 대한 KMDF 드라이버에서 I/O 요청 처리를 참조하세요.