공통 버퍼 사용
[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를 호출합니다.