MmAllocateNodePagesForMdlEx-Funktion (wdm.h)

Die MmAllocateNodePagesForMdlEx-Routine weist nicht auslagerten physischen Arbeitsspeicher von einem idealen Knoten zu und ordnet eine MDL-Struktur zu, um diesen Arbeitsspeicher 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 stammen 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 fügt MmAllocateNodePagesForMdlEx den Wert von 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 am Anfang des vorherigen Adressbereichs übersprungen werden sollen, aus dem die zugeordneten Seiten stammen können. SkipBytes muss ein ganzzahliges Vielfaches der Seitengröße des virtuellen Arbeitsspeichers in Bytes sein.

[in] TotalBytes

Die Gesamtzahl der Bytes, die für die MDL zugeordnet werden sollen.

[in] CacheType

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

[in] IdealNode

Die ideale Knotennummer. Wenn ein Multiprozessorsystem N-Knoten enthält, liegen gültige Knotennummern im Bereich von 0 bis N-1. Ihr Treiber kann die KeQueryHighestNodeNumber-Routine aufrufen, um die höchste Knotennummer zu erhalten. Ein Einzelprozessor- oder Nicht-NUMA-Multiprozessorsystem verfügt nur über einen Knoten (Knoten 0), von dem Arbeitsspeicher zugeordnet werden soll. Bei einem NUMA-Multiprozessorsystem erfolgt die Zuordnung nach Möglichkeit aus dem idealen Knoten. Wenn auf dem idealen Knoten nicht genügend Arbeitsspeicher verfügbar ist, um die Zuordnungsanforderung zu erfüllen, und der Aufrufer das MM_ALLOCATE_FROM_LOCAL_NODE_ONLY-Flag nicht festgelegt, versucht MmAllocateNodePagesForMdlEx , Arbeitsspeicher von anderen Knoten zuzuweisen.

[in] Flags

Flags für diesen Vorgang. Legen Sie diesen Parameter auf null oder auf das bitweise OR 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 bei erfolgreicher Ausführung einen Zeiger auf eine MDL-Struktur zurück. Andernfalls gibt die Routine NULL zurück, wenn die Routine keinen Arbeitsspeicher zuweist.

Der Rückgabewert NULL gibt an, dass keine physischen Speicherseiten in den angegebenen Adressbereichen verfügbar sind oder dass nicht genügend Arbeitsspeicherpool zum Zuordnen der MDL-Struktur verfügbar ist.

Wenn die Routine erfolgreich einen Teil des angeforderten Arbeitsspeichers zuordnet, aber nicht alle, beschreibt die MDL so viel physischen Arbeitsspeicher, wie die Routine zuordnen konnte.

Hinweise

In einem NUMA-Multiprozessorsystem (Non-Uniform Memory Access) kann der Aufrufer einen idealen Knoten angeben, von dem aus der Arbeitsspeicher zugeordnet werden soll. Ein Knoten ist eine Sammlung von Prozessoren, die schnellen Zugriff auf eine Speicherregion gemeinsam nutzen. In einem Nicht-NUMA-Multiprozessor- oder Einzelprozessorsystem behandelt MmAllocateNodePagesForMdlEx den gesamten Arbeitsspeicher als gehört zu einem einzelnen Knoten und ordnet Arbeitsspeicher von diesem Knoten zu.

Standardmäßig handelt es sich bei den von MmAllocateNodePagesForMdlEx zurückgegebenen Physischen Speicherseiten nicht um zusammenhängende Seiten. Aufrufer können das Standardverhalten dieser Routine überschreiben, indem sie das MM_ALLOCATE_PREFER_CONTIGUOUS oder MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS Flagbit im Flags-Parameter festlegen.

MmAllocateNodePagesForMdlEx zuordnen den zugeordneten physischen Arbeitsspeicher nicht dem virtuellen Arbeitsspeicher. 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.a. sie benötigen physische Seiten und müssen diese nicht physisch zusammenhängend sein), sowie für Kernelmodustreiber, die erhebliche Leistungssteigerungen erzielen können, wenn physischer Arbeitsspeicher für ein Gerät in einem bestimmten physischen Adressbereich zugeordnet wird (z. B. eine AGP-Grafik Karte).

Abhängig davon, wie viel physischer Arbeitsspeicher derzeit in den angeforderten Bereichen verfügbar ist, gibt MmAllocateNodePagesForMdlEx möglicherweise eine MDL zurück, die weniger Arbeitsspeicher als angefordert beschreibt. Die Routine gibt möglicherweise auch NULL zurück, wenn kein Arbeitsspeicher zugewiesen wurde. Der Aufrufer sollte die Menge an Arbeitsspeicher überprüfen, die tatsächlich zugeordnet ist, wie in der MDL beschrieben.

Der Aufrufer muss MmFreePagesFromMdl verwenden, um die Speicherseiten freizugeben, die von einer MDL beschrieben werden, die von MmAllocateNodePagesForMdlEx erstellt wurde. Nach dem Aufruf von MmFreePagesFromMdl muss der Aufrufer auch ExFreePool aufrufen, um den für die MDL-Struktur zugeordneten Arbeitsspeicher freizugeben.

Standardmäßig füllt MmAllocateNodePagesForMdlEx die Seiten, die es zuordnet, mit Nullen aus. Der Aufrufer kann das flag MM_DONT_ZERO_ALLOCATION angeben, um diese Standardeinstellung zu überschreiben und die Leistung möglicherweise zu verbessern.

Der von MmAllocateNodePagesForMdlEx zugeordnete Arbeitsspeicher wird nicht initialisiert, wenn Sie das flag MM_DONT_ZERO_ALLOCATION angeben. Ein Kernelmodustreiber muss diesen Arbeitsspeicher zunächst null sein, wenn der Treiber den Speicher für Die Software im Benutzermodus sichtbar macht (um potenziell privilegierte Inhalte zu vermeiden). Weitere Informationen zu diesem Flag finden Sie unter MM_ALLOCATE_XXX.

Die maximale Arbeitsspeichermenge, die MmAllocateNodePagesForMdlEx in einem einzelnen Aufruf zuordnen kann, beträgt (4 Gb – PAGE_SIZE). Die Routine kann eine Zuordnungsanforderung für diesen Betrag nur erfüllen, wenn genügend Seiten verfügbar sind.

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

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar ab Windows 8.
Zielplattform Universell
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (siehe Abschnitt "Hinweise").

Weitere Informationen

ExFreePool

KeQueryHighestNodeNumber

MDL

MEMORY_CACHING_TYPE

MM_ALLOCATE_XXX

MmFreePagesFromMdl

MmMapLockedPagesSpecifyCache