MmAllocateNodePagesForMdlEx 함수(wdm.h)

MmAllocateNodePagesForMdlEx 루틴은 이상적인 노드에서 페이지가 없는 실제 메모리를 할당하고 이 메모리를 설명하는 MDL 구조를 할당합니다.

구문

PMDL MmAllocateNodePagesForMdlEx(
  [in] PHYSICAL_ADDRESS    LowAddress,
  [in] PHYSICAL_ADDRESS    HighAddress,
  [in] PHYSICAL_ADDRESS    SkipBytes,
  [in] SIZE_T              TotalBytes,
  [in] MEMORY_CACHING_TYPE CacheType,
  [in] ULONG               IdealNode,
  [in] ULONG               Flags
);

매개 변수

[in] LowAddress

할당된 페이지가 올 수 있는 첫 번째 주소 범위의 시작 부분에 대한 실제 주소입니다. MmAllocateNodePagesForMdlEx가 첫 번째 주소 범위에서 요청된 바이트 수를 할당할 수 없는 경우 루틴은 추가 주소 범위를 반복하여 더 많은 페이지를 가져옵니다. 각 반복에서 MmAllocateNodePagesForMdlExSkipBytes 값을 이전 시작 주소에 추가하여 다음 주소 범위의 시작을 계산합니다.

[in] HighAddress

할당된 페이지가 올 수 있는 첫 번째 주소 범위 끝의 실제 주소입니다.

[in] SkipBytes

할당된 페이지가 올 수 있는 이전 주소 범위의 시작에서 건너뛸 바이트 수입니다. SkipBytes 는 가상 메모리 페이지 크기의 정수 배수(바이트)여야 합니다.

[in] TotalBytes

MDL에 할당할 총 바이트 수입니다.

[in] CacheType

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

[in] IdealNode

이상적인 노드 번호입니다. 다중 프로세서 시스템에 N 노드가 포함된 경우 유효한 노드 번호는 0~N-1 범위에 있습니다. 드라이버는 KeQueryHighestNodeNumber 루틴을 호출하여 가장 높은 노드 번호를 가져올 수 있습니다. 단일 프로세서 또는 비 NUMA 다중 프로세서 시스템에는 메모리를 할당할 노드 0이 하나만 있습니다. NUMA 다중 프로세서 시스템의 경우 가능한 경우 이상적인 노드에서 할당됩니다. 할당 요청을 충족하기 위해 이상적인 노드에서 메모리가 부족하고 호출자가 MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 플래그를 설정하지 않은 경우 MmAllocateNodePagesForMdlEx 는 다른 노드에서 메모리를 할당하려고 시도합니다.

[in] Flags

이 작업에 대한 플래그입니다. 이 매개 변수를 0으로 설정하거나 다음 플래그 비트 중 하나 이상의 비트 OR로 설정합니다.

  • MM_DONT_ZERO_ALLOCATION

  • MM_ALLOCATE_FROM_LOCAL_NODE_ONLY

  • MM_ALLOCATE_FULLY_REQUIRED

  • MM_ALLOCATE_NO_WAIT

  • MM_ALLOCATE_PREFER_CONTIGUOUS

  • MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS

  • MM_ALLOCATE_AND_HOT_REMOVE

이러한 플래그에 대한 자세한 내용은 MM_ALLOCATE_XXX 참조하세요.

반환 값

성공하면 MmAllocateNodePagesForMdlEx 는 MDL 구조체에 대한 포인터를 반환합니다. 그렇지 않으면 루틴이 메모리를 할당하지 못하면 루틴은 NULL을 반환합니다.

NULL의 반환 값은 지정된 주소 범위에서 사용할 수 있는 실제 메모리 페이지가 없거나 MDL 구조를 할당하는 데 사용할 수 있는 메모리 풀이 충분하지 않음을 나타냅니다.

루틴이 요청된 메모리의 일부(전부는 아님)를 성공적으로 할당하는 경우 MDL은 루틴이 할당할 수 있는 만큼의 실제 메모리를 설명합니다.

설명

NUMA(비균등 메모리 액세스) 다중 프로세서 시스템에서 호출자는 메모리를 할당할 이상적인 노드를 지정할 수 있습니다. 노드는 메모리 영역에 대한 빠른 액세스를 공유하는 프로세서 컬렉션입니다. NUMA가 아닌 다중 프로세서 또는 단일 프로세서 시스템에서 MmAllocateNodePagesForMdlEx 는 모든 메모리를 단일 노드에 속하는 것으로 처리하고 이 노드의 메모리를 할당합니다.

기본적으로 MmAllocateNodePagesForMdlEx 가 반환하는 실제 메모리 페이지는 연속 페이지가 아닙니다. 호출자는 Flags 매개 변수에서 MM_ALLOCATE_PREFER_CONTIGUOUS 또는 플래그 비트를 MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 설정하여 이 루틴의 기본 동작을 재정의할 수 있습니다.

MmAllocateNodePagesForMdlEx 는 할당된 실제 메모리를 가상 메모리에 매핑하지 않습니다. 필요한 경우 호출자는 MmMapLockedPagesSpecifyCache 와 같은 루틴을 호출하여 MDL에서 설명하는 실제 메모리 페이지를 매핑할 수 있습니다.

MmAllocateNodePagesForMdlEx는 해당 가상 주소가 필요하지 않은 커널 모드 드라이버(즉, 물리적 페이지가 필요하고 물리적으로 연속될 필요가 없음)와 디바이스에 대한 물리적 메모리가 특정 물리적 주소 범위(예: AGP 그래픽 카드)에 할당된 경우 상당한 성능 향상을 달성할 수 있는 커널 모드 드라이버를 위해 설계되었습니다.

요청된 범위에서 현재 사용 가능한 실제 메모리 양에 따라 MmAllocateNodePagesForMdlEx 는 요청된 것보다 적은 메모리를 설명하는 MDL을 반환할 수 있습니다. 메모리가 할당되지 않은 경우에도 루틴이 NULL 을 반환할 수 있습니다. 호출자는 MDL에서 설명한 대로 실제로 할당된 메모리 양을 검사 합니다.

호출자는 MmFreePagesFromMdl 을 사용하여 MmAllocateNodePagesForMdlEx에서 만든 MDL에서 설명하는 메모리 페이지를 해제해야 합니다. MmFreePagesFromMdl을 호출한 후 호출자는 ExFreePool을 호출하여 MDL 구조에 할당된 메모리를 해제해야 합니다.

기본적으로 MmAllocateNodePagesForMdlEx 는 할당하는 페이지를 0으로 채웁니다. 호출자는 MM_DONT_ZERO_ALLOCATION 플래그를 지정하여 이 기본값을 재정의하고 성능을 향상시킬 수 있습니다.

MM_DONT_ZERO_ALLOCATION 플래그를 지정하면 MmAllocateNodePagesForMdlEx 가 할당하는 메모리는 초기화되지 않습니다. 커널 모드 드라이버는 드라이버가 잠재적으로 권한 있는 콘텐츠가 누출되지 않도록 메모리를 사용자 모드 소프트웨어에 표시하려는 경우 먼저 이 메모리를 0으로 설정해야 합니다. 이 플래그에 대한 자세한 내용은 MM_ALLOCATE_XXX 참조하세요.

MmAllocateNodePagesForMdlEx가 단일 호출에서 할당할 수 있는 최대 메모리 양은 (4기가바이트 - PAGE_SIZE)입니다. 루틴은 충분한 페이지를 사용할 수 있는 경우에만 이 금액에 대한 할당 요청을 충족할 수 있습니다.

MmAllocateNodePagesForMdlEx는 IRQL <= APC_LEVEL 실행됩니다. 필요한 경우 드라이버는 DISPATCH_LEVEL MmAllocateNodePagesForMdlEx 를 호출할 수 있습니다. 그러나 APC_LEVEL 이하에서 를 호출하여 드라이버 성능을 향상시킬 수 있습니다.

요구 사항

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

추가 정보

ExFreePool

KeQueryHighestNodeNumber

Mdl

MEMORY_CACHING_TYPE

MM_ALLOCATE_XXX

MmFreePagesFromMdl

MmMapLockedPagesSpecifyCache