PALLOCATE_COMMON_BUFFER 콜백 함수(wdm.h)

AllocateCommonBuffer 루틴은 메모리를 할당하고 DMA 작업을 위해 프로세서와 디바이스 모두에서 동시에 액세스할 수 있도록 메모리를 매핑합니다.

구문

PALLOCATE_COMMON_BUFFER PallocateCommonBuffer;

PVOID PallocateCommonBuffer(
  [in]  PDMA_ADAPTER DmaAdapter,
  [in]  ULONG Length,
  [out] PPHYSICAL_ADDRESS LogicalAddress,
  [in]  BOOLEAN CacheEnabled
)
{...}

매개 변수

[in] DmaAdapter

버스 master 어댑터 또는 DMA 컨트롤러를 나타내는 IoGetDmaAdapter에서 반환된 DMA_ADAPTER 구조체에 대한 포인터입니다.

[in] Length

할당할 메모리의 바이트 수를 지정합니다.

[out] LogicalAddress

디바이스가 할당된 버퍼에 액세스하는 데 사용할 수 있는 논리 주소를 수신하는 변수에 대한 포인터입니다. 시스템이 플랫폼별 메모리 제한을 고려할 수 있으므로 MmGetPhysicalAddress 를 호출하는 대신 이 주소를 사용합니다.

[in] CacheEnabled

할당된 메모리를 캐시할 수 있는지 여부를 지정합니다.

이 매개 변수는 무시됩니다. 운영 체제는 할당할 공통 버퍼에서 캐시된 메모리를 사용하도록 설정할지 여부를 결정합니다. 이러한 결정은 프로세서 아키텍처 및 디바이스 버스를 기반으로 합니다.

x86 기반, x64 기반 및 Itanium 기반 프로세서가 있는 컴퓨터에서는 캐시된 메모리가 사용됩니다. 디바이스에서 수행하는 모든 DMA 작업은 해당 메모리를 캐싱할 수 있는 관련 CPU 캐시와 일관성이 있다고 가정합니다. 드라이버가 캐싱을 사용하지 않도록 설정해야 하는 경우 대신 AllocateCommonBufferEx 를 호출합니다.

ARM 또는 ARM 64 기반 프로세서가 있는 컴퓨터에서 운영 체제는 모든 디바이스에 대해 캐시된 메모리를 자동으로 사용하도록 설정하지 않습니다. 시스템은 각 디바이스에 대한 ACPI_CCA 메서드를 사용하여 디바이스가 캐시 일관성인지 여부를 확인합니다.

반환 값

AllocateCommonBuffer 는 할당된 범위의 기본 가상 주소를 반환합니다. 버퍼를 할당할 수 없는 경우 NULL을 반환합니다.

설명

AllocateCommonBuffer 는 이름으로 직접 호출할 수 있는 시스템 루틴이 아닙니다. 이 루틴은 DMA_OPERATIONS 구조에서 반환된 주소의 포인터로만 호출할 수 있습니다. 드라이버는 IoGetDmaAdapter를 호출하여 이 루틴의 주소를 가져옵니다.

AllocateCommonBuffer는 버스 master DMA 디바이스의 제어 구조에서와 같이 디바이스와 프로세서가 시스템 메모리를 통해 지속적으로 통신하는 DMA를 지원합니다.

또한 AllocateCommonBuffer 는 드라이버가 시스템 DMA 컨트롤러의 자동 초기화 모드를 사용하는 하위 디바이스를 지원합니다.

AllocateCommonBuffer 는 다음을 수행합니다.

  • 프로세서와 디바이스 모두에서 연결할 수 있는 메모리를 할당합니다. 이 메모리는 디바이스에 연속으로 나타납니다.
  • 시스템에서 필요한 경우 맵 레지스터를 할당하여 버퍼를 매핑합니다.
  • 필요한 경우 맵 레지스터 로드를 포함하여 디바이스에 대한 번역을 설정합니다.
상주 시스템 메모리를 경제적으로 사용하려면 드라이버가 디바이스당 가능한 한 적은 수의 버퍼를 할당해야 합니다. AllocateCommonBuffer 는 요청된 길이에 관계없이 적어도 메모리 페이지를 할당 합니다. 할당이 성공한 후 PAGE_SIZE 바이트 미만을 요청하면 호출자는 요청된 Length에만 액세스할 수 있습니다. PAGE_SIZE 바이트의 정수 배수 이상을 요청하는 할당이 성공하면 마지막으로 할당된 페이지의 나머지 바이트는 호출자에게 액세스할 수 없습니다.

드라이버에 공통 버퍼 공간의 여러 페이지가 필요하지만 페이지가 연속적일 필요는 없는 경우 드라이버는 하나의 큰 요청 대신 AllocateCommonBuffer 에 여러 페이지 요청을 수행해야 합니다. 이 방법은 연속 메모리를 절약합니다.

드라이버는 일반적으로 PnP IRP_MN_START_DEVICE 요청에 응답하는 동안 디바이스 시작의 일부로 AllocateCommonBuffer를 호출합니다. 시작 후 한 페이지 요청만 성공할 수 있습니다(있는 경우).

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 데스크톱
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
IRQL PASSIVE_LEVEL
DDI 규정 준수 규칙 IrqlDispatch(wdm)

추가 정보

DMA_ADAPTER

DMA_OPERATIONS

FreeCommonBuffer

IoGetDmaAdapter