[KMDF에만 적용]
DMA 디바이스용 드라이버는 디바이스와 드라이버가 모두 액세스할 수 있는 버퍼 공간을 할당해야 하는 경우가 있습니다. 예를 들어 디바이스는 바이트 수와 같은 전송 정보를 이 버퍼 공간에 쓸 수 있으며 드라이버는 이를 읽어 전송된 바이트 수를 확인할 수 있습니다. 이러한 유형의 버퍼 공간을 공통 버퍼라고 합니다.
공통 버퍼를 할당하기 위해 드라이버의 EvtDriverDeviceAdd 콜백 함수는 다음과 같습니다.
WdfDmaEnablerCreate를 호출하여 DMA 인에이블러 개체를 만듭니다.
WdfCommonBufferCreate 또는 WdfCommonBufferCreateWithConfig를 호출하여 버퍼를 만듭니다.
WdfCommonBufferGetAlignedLogicalAddress를 호출하여 디바이스에서 액세스할 수 있는 버퍼의 논리 주소를 가져옵니다.
WdfCommonBufferGetAlignedVirtualAddress를 호출하여 드라이버가 액세스할 수 있는 버퍼의 가상 주소를 가져옵니다.
다음 코드 예제는 PLX9x5x 샘플의 Init.c 파일에서 가져옵니다. 이 코드는 KMDF 드라이버가 공통 버퍼 공간을 할당하는 방법을 보여 줍니다.
// Allocate common buffer for building writes
DevExt->WriteCommonBufferSize =
sizeof( DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
DevExt->WriteCommonBufferSize,
WDF_NO_OBJECT_ATTRIBUTES,
&DevExt->WriteCommonBuffer );
if (!NT_SUCCESS(status)) {
. . . //Error-handling code omitted
}
DevExt->WriteCommonBufferBase =
WdfCommonBufferGetAlignedVirtualAddress(
DevExt->WriteCommonBuffer);
DevExt->WriteCommonBufferBaseLA =
WdfCommonBufferGetAlignedLogicalAddress(
DevExt->WriteCommonBuffer);
RtlZeroMemory( DevExt->WriteCommonBufferBase, DevExt->WriteCommonBufferSize);
WdfDmaEnablerCreate를 호출하기 전에 드라이버가 WdfDeviceSetAlignmentRequirement를 호출하는 경우 WdfDmaEnablerCreate가 만드는 버퍼는 드라이버가 WdfDeviceSetAlignmentRequirement에 지정한 메모리 주소 경계에 맞춰집니다. 그렇지 않으면 공통 버퍼가 단어 주소 경계에 맞춰집니다. 또는 드라이버가 WdfCommonBufferCreateWithConfig 를 호출하여 단일 버퍼에 대한 맞춤을 지정할 수 있습니다.
드라이버가 할당한 공통 버퍼의 길이를 얻기 위해 드라이버는 WdfCommonBufferGetLength를 호출할 수 있습니다.
드라이버가 공통 버퍼를 사용하여 완료되면 드라이버는 WdfObjectDelete를 호출합니다.