MmAllocateContiguousMemory 함수(wdm.h)

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

구문

PVOID MmAllocateContiguousMemory(
  [in] SIZE_T           NumberOfBytes,
  [in] PHYSICAL_ADDRESS HighestAcceptableAddress
);

매개 변수

[in] NumberOfBytes

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

[in] HighestAcceptableAddress

호출자가 사용할 수 있는 가장 유효한 실제 주소입니다. 예를 들어 디바이스가 프로세서의 실제 메모리 주소 범위의 처음 16메가바이트 내의 위치만 처리할 수 있는 경우 이 디바이스의 드라이버는 HighestAcceptableAddress 를 0x0000000000FFFFFF 설정해야 합니다. 메모리 할당에 대한 특정 요구 사항이 없는 경우 를 MAXULONG64.

반환 값

MmAllocateContiguousMemory 는 할당된 메모리에 대한 기본 가상 주소를 반환합니다. 요청을 충족할 수 없는 경우 루틴은 NULL을 반환합니다.

설명

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

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

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

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

RAM이 많은 컴퓨터에서 실제 메모리가 조각화되면 운영 체제에서 연속 메모리 블록을 검색해야 하는 MmAllocateContiguousMemory를 호출하면 성능이 크게 저하될 수 있습니다. 이 성능 저하는 Windows Vista SP1 및 Windows Server 2008부터 크게 감소하지만 연속 메모리는 할당 비용이 많이 들 수 있습니다. 이러한 이유로 드라이버는 MmAllocateContiguousMemory에 대한 반복 호출을 피해야 합니다. 대신 드라이버는 DriverEntry 루틴에 필요한 모든 연속 버퍼를 할당하고 이러한 버퍼를 다시 사용해야 합니다.

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

요구 사항

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

추가 정보

AllocateCommonBuffer

DriverEntry

MmAllocateContiguousMemorySpecifyCache

MmAllocateNonCachedMemory

MmFreeContiguousMemory