Freigeben über


MmAllocateNodePagesForMdlEx-Funktion (wdm.h)

Die MmAllocateNodePagesForMdlEx- Routine weist nicht seitenseitigen physischen Speicher von einem idealen Knoten zu und weist eine MDL- Struktur zu, um diesen Speicher zu beschreiben.

Syntax

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
);

Parameter

[in] LowAddress

Die physische Adresse des Anfangs des ersten Adressbereichs, aus dem die zugeordneten Seiten kommen können. Wenn MmAllocateNodePagesForMdlEx die angeforderte Anzahl von Bytes im ersten Adressbereich nicht zuordnen kann, durchläuft die Routine zusätzliche Adressbereiche, um weitere Seiten abzurufen. Bei jeder Iteration addiert MmAllocateNodePagesForMdlEx den Wert SkipBytes zur vorherigen Startadresse hinzu, um den Anfang des nächsten Adressbereichs zu berechnen.

[in] HighAddress

Die physische Adresse des Endes des ersten Adressbereichs, aus dem die zugeordneten Seiten stammen können.

[in] SkipBytes

Die Anzahl der Bytes, die vom Anfang des vorherigen Adressbereichs übersprungen werden sollen, aus dem die zugeordneten Seiten stammen können. SkipBytes- muss ein ganzzahliges Vielfaches der Größe der virtuellen Speicherseite in Byte sein.

[in] TotalBytes

Die Gesamtanzahl der Bytes, die für die MDL zugewiesen werden sollen.

[in] CacheType

Ein MEMORY_CACHING_TYPE Wert, der den Typ der Zwischenspeicherung angibt, der für den angeforderten Speicher zulässig ist.

[in] IdealNode

Die ideale Knotennummer. Wenn ein Multiprozessorsystem N-Knoten enthält, befinden sich gültige Knotennummern im Bereich 0 bis N-1. Ihr Treiber kann die KeQueryHighestNodeNumber Routine aufrufen, um die höchste Knotennummer abzurufen. Ein Single-Processor- oder Nicht-NUMA-Multiprozessorsystem verfügt nur über einen Knoten, Knoten 0, von dem Speicher zugewiesen werden soll. Bei einem NUMA-Multiprozessorsystem wird die Zuordnung nach Möglichkeit vom idealen Knoten vorgenommen. Wenn nicht genügend Arbeitsspeicher im idealen Knoten verfügbar ist, um die Zuordnungsanforderung zu erfüllen, und der Aufrufer das MM_ALLOCATE_FROM_LOCAL_NODE_ONLY Flag nicht festgelegt, versucht MmAllocateNodePagesForMdlEx-, Speicher von anderen Knoten zuzuweisen.

[in] Flags

Flags für diesen Vorgang. Legen Sie diesen Parameter auf Null oder auf das bitweise ODER eines oder mehrerer der folgenden Flagbits fest:

  • 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

Weitere Informationen zu diesen Flags finden Sie unter MM_ALLOCATE_XXX.

Rückgabewert

MmAllocateNodePagesForMdlEx gibt einen Zeiger auf eine MDL-Struktur zurück, wenn dies erfolgreich ist. Andernfalls gibt die Routine, wenn die Routine keinen Speicher zuweist, NULL-zurück.

Ein Rückgabewert von NULL- gibt an, dass keine physischen Speicherseiten in den angegebenen Adressbereichen verfügbar sind oder dass nicht genügend Arbeitsspeicherpool verfügbar ist, um die MDL-Struktur zuzuweisen.

Wenn die Routine einige, aber nicht alle, des angeforderten Speichers erfolgreich zuweist, beschreibt die MDL so viel physischen Arbeitsspeicher wie die Routine zuordnen konnte.

Bemerkungen

In einem nicht uniform Memory Access (NUMA)-Multiprozessorsystem kann der Aufrufer einen idealen Knoten angeben, von dem der Speicher zugeordnet werden soll. Ein Knoten ist eine Sammlung von Prozessoren, die schnellen Zugriff auf einen Speicherbereich teilen. In einem Nicht-NUMA-Multiprozessor oder einem System mit einem einzelnen Prozessor behandelt MmAllocateNodePagesForMdlEx den gesamten Speicher als einem einzelnen Knoten zugeordnet und weist Speicher von diesem Knoten zu.

Standardmäßig sind die physischen Speicherseiten , die mmAllocateNodePagesForMdlEx zurückgeben, nicht zusammenhängende Seiten. Aufrufer können das Standardverhalten dieser Routine außer Kraft setzen, indem sie das MM_ALLOCATE_PREFER_CONTIGUOUS- oder MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS Flagbit im parameter Flags festlegen.

MmAllocateNodePagesForMdlEx wird der zugeordnete physische Speicher nicht in virtuellem Speicher zugeordnet. Bei Bedarf kann der Aufrufer eine Routine wie MmMapLockedPagesSpecifyCache- aufrufen, um die von der MDL beschriebenen physischen Speicherseiten zuzuordnen.

MmAllocateNodePagesForMdlEx ist für Kernelmodustreiber konzipiert, die keine entsprechenden virtuellen Adressen benötigen (d. h., sie benötigen physische Seiten und müssen nicht physisch zusammenhängend sein), und für Kernelmodustreiber, die erhebliche Leistungsgewinne erzielen können, wenn physischer Speicher für ein Gerät in einem bestimmten physischen Adressbereich zugewiesen wird (z. B. eine AGP-Grafikkarte).

Je nachdem, wie viel physischer Arbeitsspeicher derzeit in den angeforderten Bereichen verfügbar ist, gibt MmAllocateNodePagesForMdlEx möglicherweise eine MDL zurück, die weniger Arbeitsspeicher beschreibt als angefordert. Die Routine kann auch NULL- zurückgeben, wenn kein Speicher zugewiesen wurde. Der Aufrufer sollte die tatsächlich zugeordnete Arbeitsspeichermenge überprüfen, wie von der MDL beschrieben.

Der Aufrufer muss MmFreePagesFromMdl- verwenden, um die Speicherseiten freizugeben, die von einer MDL beschrieben werden, die von MmAllocateNodePagesForMdlExerstellt wurde. Nach dem Aufrufen MmFreePagesFromMdlmuss der Aufrufer auch ExFreePool- aufrufen, um den für die MDL-Struktur zugewiesenen Speicher freizugeben.

Standardmäßig füllt MmAllocateNodePagesForMdlEx die Seiten aus, die sie mit Nullen zuordnet. Der Aufrufer kann das MM_DONT_ZERO_ALLOCATION Flag angeben, um diese Standardeinstellung außer Kraft zu setzen und möglicherweise die Leistung zu verbessern.

Speicher, der MmAllocateNodePagesForMdlEx zugeordnet wird, wird nicht initialisiert, wenn Sie das MM_DONT_ZERO_ALLOCATION Flag angeben. Ein Kernelmodustreiber muss zuerst diesen Speicher null sein, wenn der Treiber den Speicher für die Benutzermodussoftware sichtbar macht (um zu vermeiden, dass potenziell privilegierte Inhalte verloren gehen). Weitere Informationen zu diesem Kennzeichen finden Sie unter MM_ALLOCATE_XXX.

Die maximale Speichermenge, die MmAllocateNodePagesForMdlEx- in einem einzelnen Anruf zuordnen kann, ist (4 Gigabyte - PAGE_SIZE). Die Routine kann eine Zuordnungsanforderung für diesen Betrag nur erfüllen, wenn genügend Seiten verfügbar sind.

MmAllocateNodePagesForMdlEx wird bei IRQL <= APC_LEVEL ausgeführt. Bei Bedarf kann Ihr Treiber MmAllocateNodePagesForMdlEx- bei DISPATCH_LEVEL aufrufen. Sie können jedoch die Treiberleistung verbessern, indem Sie APC_LEVEL oder unten aufrufen.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Verfügbar ab Windows 8.
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <= DISPATCH_LEVEL (Siehe Abschnitt "Hinweise").)

Siehe auch

ExFreePool-

KeQueryHighestNodeNumber

MDL-

MEMORY_CACHING_TYPE

MM_ALLOCATE_XXX

MmFreePagesFromMdl

MmMapLockedPagesSpecifyCache-