단일 전송 DMA 사용
기본적으로 WDF는 경우에 따라 단일 DMA 트랜잭션을 여러 DMA 전송으로 분할합니다. 그러나 일부 디바이스는 조각난 트랜잭션을 처리할 수 없으며 대신 단일 DMA 작업에서 모든 데이터를 수신해야 합니다. 예를 들어 일부 PCI 네트워크 컨트롤러에는 부분 데이터를 캐시하고 다시 어셈블할 하드웨어가 없기 때문에 한 번에 하나의 네트워크 패킷이 필요합니다.
KMDF 버전 1.19부터 DMA v3을 사용하는 KMDF 드라이버는 단일 전송 DMA 트랜잭션이 필요하도록 지정할 수 있습니다. 드라이버는 단일 DMA 트랜잭션에 대해서만 단일 전송을 지정하거나 지정된 DMA 인에이블러를 사용하여 만든 모든 DMA 트랜잭션에 대해 단일 전송을 지정할 수 있습니다.
특정 DMA 트랜잭션에 대한 단일 전송 설정
단일 트랜잭션에 대한 단일 전송을 설정하려면 다음 시퀀스를 사용합니다.
- WdfDmaTransactionCreate 또는 WdfDmaTransactionRelease를 호출합니다.
- WdfDmaTransactionSetSingleTransferRequirement를 호출합니다.
- WdfDmaTransactionInitialize를 호출합니다.
트랜잭션 조각화로 인해 초기화가 실패하면 드라이버는 I/O 요청에 실패하거나 트랜잭션의 메모리 버퍼를 다시 정렬하고 트랜잭션을 다시 초기화할 수 있습니다. - 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 요청 처리를 참조하세요.