MmAllocateContiguousMemorySpecifyCache 함수(wdm.h)

MmAllocateContiguousMemorySpecifyCache 루틴은 연속되고 페이지가 없는 물리적 메모리 범위를 할당하고 시스템 주소 공간에 매핑합니다.

구문

PVOID MmAllocateContiguousMemorySpecifyCache(
  [in]           SIZE_T              NumberOfBytes,
  [in]           PHYSICAL_ADDRESS    LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS    HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS    BoundaryAddressMultiple,
  [in]           MEMORY_CACHING_TYPE CacheType
);

매개 변수

[in] NumberOfBytes

할당할 연속 메모리 블록의 크기(바이트)입니다. 자세한 내용은 설명 부분을 참조하세요.

[in] LowestAcceptableAddress

호출자가 사용할 수 있는 가장 낮은 유효한 실제 주소입니다. 예를 들어 디바이스가 프로세서의 실제 메모리 주소 범위의 처음 8메가바이트 이상의 위치만 처리할 수 있는 경우 이 디바이스의 드라이버는 LowestAcceptableAddress 를 0x0000000000800000 설정해야 합니다.

[in] HighestAcceptableAddress

호출자가 사용할 수 있는 가장 높은 유효한 실제 주소입니다. 예를 들어 디바이스가 프로세서의 실제 메모리 주소 범위의 처음 16메가바이트 내의 위치만 처리할 수 있는 경우 이 디바이스의 드라이버는 가장 높은 허용 가능Address 를 0x0000000000FFFFFF 설정해야 합니다.

[in, optional] BoundaryAddressMultiple

할당된 버퍼가 교차해서는 안 되는 물리적 주소 배수입니다. 실제 주소 배수는 항상 2의 힘이어야 합니다. 이 매개 변수는 선택 사항이며 디바이스에 특별한 메모리 경계 제한이 없음을 나타내기 위해 0으로 지정할 수 있습니다. 자세한 내용은 설명 부분을 참조하세요.

[in] CacheType

요청된 메모리에 허용되는 캐싱 유형을 나타내는 MEMORY_CACHING_TYPE 값을 지정합니다.

반환 값

MmAllocateContiguousMemorySpecifyCache 는 할당된 메모리의 기본 가상 주소를 반환합니다. 시스템에서 요청된 버퍼를 할당할 수 없는 경우 루틴은 NULL을 반환합니다.

설명

MmAllocateContiguousMemorySpecifyCache 는 물리적 주소 공간에서 연속되는 비페이지 메모리 블록을 할당합니다. 루틴은 이 블록을 시스템 주소 공간의 연속된 가상 메모리 블록에 매핑하고 이 블록의 기본 가상 주소를 반환합니다. 루틴은 연속 메모리 할당의 시작 주소를 메모리 페이지 경계에 맞춥니다.

드라이버는 요청된 할당 크기를 초과하는 메모리에 액세스해서는 안됩니다. 예를 들어 개발자는 드라이버가 요청된 할당의 끝과 다음 페이지 경계 사이에 메모리를 안전하게 사용할 수 있다고 가정해서는 안 됩니다.

연속된 물리적 메모리는 일반적으로 공급이 부족하기 때문에 필요할 때만 아끼고 사용해야 합니다. 연속 메모리를 사용해야 하는 드라이버는 운영 체제가 메모리를 할당하고 해제할 때 시간이 지남에 따라 실제 메모리가 조각화될 가능성이 높기 때문에 드라이버 초기화 중에 이 메모리를 할당해야 합니다. 일반적으로 드라이버는 DriverEntry 루틴에서 MmAllocateContiguousMemorySpecifyCache를 호출하여 장기 사용을 위해 내부 버퍼를 할당하고 드라이버가 언로드되기 직전에 버퍼를 해제합니다.

메모리가 더 이상 필요하지 않은 경우 MmAllocateContiguousMemorySpecifyCache 에서 할당한 메모리를 해제해야 합니다. MmAllocateContiguousMemorySpecifyCache에 의해 할당된 메모리를 해제하려면 MmFreeContiguousMemory 루틴을 호출합니다.

BoundaryAddressMultiple 매개 변수에 0이 아닌 값을 지정하는 경우 할당된 메모리 블록의 실제 주소 범위는 이 값의 정수 배수인 주소 경계를 넘지 않습니다. 하드웨어 제한을 해결하기 위해 0이 아닌 값이 필요한 경우가 아니면 드라이버는 이 매개 변수를 0으로 설정해야 합니다. 예를 들어 디바이스가 16메가바이트의 물리적 경계를 넘어 데이터를 전송할 수 없는 경우 드라이버는 이 매개 변수에 대한 0x1000000 값을 지정하여 디바이스에서 볼 수 있는 주소가 16메가바이트 경계에서 래핑되지 않도록 해야 합니다.

메모리가 많은 컴퓨터에서 MmAllocateContiguousMemorySpecifyCache 루틴을 사용하는 경우 시스템이 연속 메모리 청크를 만들려고 할 때 운영 체제의 성능이 심각하게 저하될 수 있습니다. 이 성능 저하는 Windows Vista SP1 및 Windows Server 2008부터 크게 감소하지만 연속 메모리는 할당 비용이 많이 들 수 있습니다. 이러한 이유로 드라이버는 MmAllocateContiguousMemorySpecifyCache에 대한 반복 호출을 피해야 합니다. 대신 드라이버는 DriverEntry 루틴에 필요한 모든 연속 버퍼를 할당하고 이러한 버퍼를 다시 사용해야 합니다.

MmAllocateContiguousMemorySpecifyCache가 할당하는 메모리는 초기화되지 않습니다. 커널 모드 드라이버는 잠재적으로 권한 있는 콘텐츠가 누출되지 않도록 사용자 모드 소프트웨어에 표시하려면 먼저 이 메모리를 0으로 설정해야 합니다.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

추가 정보

MmAllocateContiguousMemory

MmFreeContiguousMemory