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 에 여러 페이지 요청을 수행해야 합니다. 이 방법은 연속 메모리를 절약합니다.
드라이버는 일반적으로 PnP IRP_MN_START_DEVICE 요청에 응답하는 동안 디바이스 시작의 일부로 AllocateCommonBuffer를 호출합니다. 시작 후 한 페이지 요청만 성공할 수 있습니다(있는 경우).
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 2000부터 사용할 수 있습니다. |
대상 플랫폼 | 데스크톱 |
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
IRQL | PASSIVE_LEVEL |
DDI 규정 준수 규칙 | IrqlDispatch(wdm) |