MmAllocateContiguousNodeMemory 함수(wdm.h)

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

구문

PVOID MmAllocateContiguousNodeMemory(
  [in]           SIZE_T           NumberOfBytes,
  [in]           PHYSICAL_ADDRESS LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
  [in]           ULONG            Protect,
  [in]           NODE_REQUIREMENT PreferredNode
);

매개 변수

[in] NumberOfBytes

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

[in] LowestAcceptableAddress

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

[in] HighestAcceptableAddress

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

[in, optional] BoundaryAddressMultiple

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

[in] Protect

할당된 메모리에 사용할 보호를 지정하는 비트에 플래그를 지정합니다. 호출자는 Protect 매개 변수에서 다음 플래그 비트 중 하나(둘 다 아님)를 설정해야 합니다.

플래그 비트 의미
PAGE_READWRITE 읽기/쓰기, NX(실행 안 됨) 메모리를 할당합니다. 대부분의 호출자는 이 플래그 비트를 설정해야 합니다. 자세한 내용은 설명 부분을 참조하세요.
PAGE_EXECUTE_READWRITE 실행 가능한 읽기/쓰기 메모리를 할당합니다. 호출자가 할당된 메모리에서 명령을 실행하는 기능이 필요한 경우에만 이 플래그 비트를 설정해야 합니다.

또한 호출자는 Protect 매개 변수에서 다음 선택적 플래그 비트 중 하나(둘 다 아님)를 설정할 수 있습니다.

플래그 비트 의미
PAGE_NOCACHE 캐시하지 않은 메모리를 할당합니다. 이 플래그 비트는 CacheTypeMmNonCached로 설정된 MmAllocateContiguousMemorySpecifyCache를 호출하는 것과 비슷합니다.
PAGE_WRITECOMBINE 쓰기 결합 메모리를 할당합니다. 이 플래그 비트는 CacheTypeMmWriteCombined로 설정된 MmAllocateContiguousMemorySpecifyCache를 호출하는 것과 비슷합니다.

PAGE_NOCACHE 또는 PAGE_WRITECOMBINE 지정하지 않으면 할당된 메모리가 완전히 캐시됩니다. 이 경우 효과는 CacheTypeMmCached로 설정된 MmAllocateContiguousMemorySpecifyCache를 호출하는 것과 유사합니다.

[in] PreferredNode

기본 설정 노드 번호입니다. 다중 프로세서 시스템에 N 노드가 포함된 경우 노드 번호는 0에서 N-1로 지정됩니다. 호출자가 PreferredNode 를 MM_ANY_NODE_OK 설정하는 경우 루틴은 메모리를 할당할 노드를 선택합니다. 그렇지 않으면 지정된 주소 범위의 메모리를 기본 노드에서 할당할 수 없는 경우 루틴은 NULL을 반환합니다.

반환 값

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

설명

커널 모드 디바이스 드라이버는 이 루틴을 호출하여 연속된 물리적 메모리 블록을 할당합니다. 호출 드라이버는 할당에 NX(no-execute) 메모리를 사용할지 여부를 지정할 수 있습니다. NUMA(비균등 메모리 액세스) 다중 프로세서 시스템에서 호출자는 메모리를 할당할 기본 노드를 지정할 수 있습니다. 노드는 메모리 영역에 대한 빠른 액세스를 공유하는 프로세서의 컬렉션입니다. 비 NUMA 다중 프로세서 또는 단일 프로세서 시스템에서 MmAllocateContiguousNodeMemory 는 모든 메모리를 단일 노드에 속하는 것으로 처리하고 이 노드의 메모리를 할당합니다.

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

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

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

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

MmAllocateContiguousNodeMemoryMmAllocateContiguousMemorySpecifyCacheNode 루틴과 유사합니다. MmAllocateContiguousMemorySpecifyCacheNode와 달리 MmAllocateContiguousNodeMemory를 사용하여 NX(실행 안 됨) 메모리를 할당할 수 있습니다. 드라이버가 할당된 메모리에서 명령을 실행할 수 있는 기능을 명시적으로 요구하지 않는 한 드라이버는 NX 메모리를 할당하는 것이 가장 좋습니다. NX 메모리를 할당하면 드라이버가 악성 소프트웨어가 이 메모리에서 지침을 실행하지 못하도록 하여 보안을 향상시킵니다. MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCacheMmAllocateContiguousMemorySpecifyCacheNode 루틴에 의해 할당된 메모리는 항상 실행 가능합니다.

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

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

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8 시작해서 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

추가 정보

DriverEntry

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory