MmAllocatePagesForMdlEx-Funktion (wdm.h)
Die MmAllocatePagesForMdlEx- Routine weist einer MDL nichtpagete, physische Speicherseiten zu.
Verwenden Sie diese Routine anstelle von MmAllocatePagesForMdl.
Syntax
PMDL MmAllocatePagesForMdlEx(
[in] PHYSICAL_ADDRESS LowAddress,
[in] PHYSICAL_ADDRESS HighAddress,
[in] PHYSICAL_ADDRESS SkipBytes,
[in] SIZE_T TotalBytes,
[in] MEMORY_CACHING_TYPE CacheType,
[in] ULONG Flags
);
Parameter
[in] LowAddress
Gibt die physische Adresse des Anfangs des ersten Adressbereichs an, aus dem die zugeordneten Seiten kommen können. Wenn MmAllocatePagesForMdlEx die angeforderte Anzahl von Bytes im ersten Adressbereich nicht zuordnen kann, durchläuft es zusätzliche Adressbereiche, um weitere Seiten abzurufen. Bei jeder Iteration fügt MmAllocatePagesForMdlEx den Wert SkipBytes zur vorherigen Startadresse hinzu, um den Anfang des nächsten Adressbereichs abzurufen.
[in] HighAddress
Gibt die physische Adresse des Endes des ersten Adressbereichs an, aus dem die zugeordneten Seiten stammen können.
[in] SkipBytes
Gibt die Anzahl der Bytes an, 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
Gibt die Gesamtanzahl der Bytes an, die für die MDL zugewiesen werden sollen.
[in] CacheType
Gibt einen MEMORY_CACHING_TYPE Wert an, der den Typ der Zwischenspeicherung angibt, der für den angeforderten Arbeitsspeicher zulässig ist.
[in] Flags
Gibt Flags für diesen Vorgang an. Legen Sie diesen Parameter auf Null oder auf den bitweisen OR einer oder mehrerer der folgenden MM_ALLOCATE_XXX- Flagbits fest:
Die letzten vier Elemente in der vorherigen Liste werden nur in Windows 7- und höher-Versionen von Windows unterstützt.
Wert | Bedeutung |
---|---|
MM_DONT_ZERO_ALLOCATION 0x00000001 | Füllen Sie die zugeordneten Seiten nicht mit Nullen aus. Standardmäßig ergibt MmAllocatePagesForMdlEx null die seiten, die sie zuweist. Durch das Überspringen dieses Vorgangs können Sie die Leistung des MmAllocatePagesForMdlEx-Aufrufs potenziell verbessern. Sie dürfen dieses Flag jedoch nur verwenden, wenn Sie die zugeordneten Seiten nie für Benutzermodusprogramme verfügbar machen, oder Sie überschreiben immer den ursprünglichen Inhalt der Seiten, bevor Sie die zugeordneten Seiten für Benutzermodusprogramme verfügbar machen. |
MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002 | Weisen Sie Seiten nur vom idealen Knoten zu. Dieses Kennzeichen gilt nur für Multiprozessorsysteme, die über nicht einheitliche Speicherzugriffsarchitekturen (NUMA) verfügen. Ab Windows Vista gibt dieses Flag an, dass alle Seiten vom idealen Knoten des aktuellen Threads zugeordnet werden müssen. Es müssen keine Seiten von anderen Knoten zugewiesen werden. In Versionen von Windows vor Windows Vista weist dieses Kennzeichen darauf hin, dass alle Seiten vom lokalen Knoten zugewiesen werden müssen; d. h. vom Knoten, zu dem der aktuelle Prozessor gehört. Weitere Informationen zu NUMA-Multiprozessorsystemen finden Sie unter NUMA Support . |
MM_ALLOCATE_FULLY_REQUIRED 0x00000004 | Eine vollständige Zuordnung ist erforderlich. Ab Windows 7 muss dieses Flag MmAllocatePagesForMdlEx null zurückgeben, wenn nicht alle angeforderten Seiten zugeordnet werden können. Die Routine gibt nur dann einen Wert ungleich NULL zurück, wenn er die gesamte angeforderte Zuordnung erfolgreich abruft. Mit dieser Kennzeichnung kann der Speichermanager die Zuordnung effizienter ausführen, in Fällen, in denen der Aufrufer eine vollständige Zuordnung erfordert. |
MM_ALLOCATE_NO_WAIT 0x00000008 | Warten Sie nicht. Ab Windows 7 gibt dieses Flag an, dass der MmAllocatePagesForMdlEx-Aufruf den aufrufenden Thread nicht blockieren darf. In der Regel ist der Aufrufer ein Kernelmodustreiber, der bei IRQL-< DISPATCH_LEVEL ausgeführt wird, die Ausführung jedoch nicht zulassen kann. Beispielsweise kann der Treiber bei Paging- oder Energieverwaltungsvorgängen unterstützt werden. Unabhängig davon, ob dieses Flag festgelegt ist, blockiert MmAllocatePagesForMdlEx nie Aufrufer, die unter IRQL = DISPATCH_LEVEL ausgeführt werden. |
MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010 | Die Zuweisung erfolgt so, dass die Systemspeicherfragmentierung minimiert wird. Ab Windows 7 gibt dieses Flag an, dass der Aufrufer das Fragmentieren des physischen Speichers vermeiden möchte, um weiteren zusammenhängenden Arbeitsspeicher für andere Aufrufer zur Verfügung zu stellen. Die zugeordneten Seiten sind nicht garantiert (und sind in der Regel nicht) physisch zusammenhängend, auch wenn viel zusammenhängender Arbeitsspeicher verfügbar ist. Aufrufer, die zusammenhängenden Arbeitsspeicher erfordern, sollten anstelle von MM_ALLOCATE_PREFER_CONTIGUOUS MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS angeben. |
MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020 | Zusammenhängender Arbeitsspeicher ist erforderlich. Ab Windows 7 gibt dieses Flag an, dass die angeforderten Seiten als zusammenhängende Speicherblöcke zugewiesen werden müssen. Wenn der Parameter SkipBytes null ist, ist MmAllocatePagesForMdlEx entweder erfolgreich und gibt einen einzelnen, zusammenhängenden Block zurück oder schlägt fehl und gibt NULL zurück. Sie gibt niemals eine teilverteilte Zuordnung zurück. Bei SkipBytes = 0 erfüllen die zugeordneten Seiten die Adressbereichsanforderungen, die von den Parametern LowAddress und HighAddress angegeben werden, die Seiten unterliegen jedoch keinen besonderen Ausrichtungseinschränkungen. Wenn SkipBytes nicht null ist, muss SkipBytes eine Leistung von zwei Und muss größer oder gleich PAGE_SIZE sein, und der Parameterwert TotalBytes muss ein Vielfaches von SkipBytes sein. In diesem Fall kann die zurückgegebene MDL mehrere Blöcke zusammenhängender Seiten enthalten. Das heißt, jeder Block ist intern zusammenhängend, aber die Blöcke sind nicht notwendigerweise miteinander zusammenhängend. Jeder Block zusammenhängender Seiten ist garantiert genau SkipBytes lang und wird an einer SkipBytes-Grenze ausgerichtet. Partielle Zuordnungen können auftreten, wenn SkipBytes nicht null ist, aber jeder zusammenhängende Block in einer Teilzuordnung ist garantiert SkipBytes lang. |
MM_ALLOCATE_FAST_LARGE_PAGES 0x00000040 | Ab Windows 8 gibt dieses Flag an, dass die Zuordnung aus dem großen Seitencache des Betriebssystems erfüllt werden muss. Wenn der Cache leer ist, schlägt die Zuordnung fehl. Wenn MM_ALLOCATE_FAST_LARGE_PAGES nicht angegeben ist, verwendet MmAllocatePagesForMdlEx zwischengespeicherte große Seiten, wenn sie verfügbar sind. Wenn der Cache erschöpft ist, MmAllocatePagesForMdlEx versucht, zusätzliche große Seiten zu erstellen, was eine lange Zeit dauern kann. MM_ALLOCATE_FAST_LARGE_PAGES muss mit dem MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS-Flag verwendet werden. Der SkipBytes Parameter muss auf ein Vielfaches großer Seitengröße festgelegt werden. |
MM_ALLOCATE_AND_HOT_REMOVE 0x00000100 | Ab Windows 10 wird durch dieses Kennzeichen die zugeordneten Seiten aus dem Pool des physischen Speichers entfernt, der von Windows verwaltet wird. MM_ALLOCATE_AND_HOT_REMOVE können nicht zusammen mit MM_ALLOCATE_FULLY_REQUIRED angegeben werden. Wenn MM_ALLOCATE_AND_HOT_REMOVE angegeben ist, muss der Aufrufer unter IRQL = PASSIVE_LEVEL ausgeführt werden. |
Rückgabewert
MmAllocatePagesForMdlEx gibt eine der folgenden Werte zurück:
Rückgabecode | Beschreibung |
---|---|
MDL-Zeiger- | Ein nichtNULL- Rückgabewert ist ein Zeiger auf eine MDL, die einen Satz physischer Seiten im angegebenen Adressbereich beschreibt. Wenn die angeforderte Anzahl von Bytes nicht verfügbar ist, beschreibt die MDL so viel physischen Arbeitsspeicher wie verfügbar. |
NULL- | Gibt an, dass keine physischen Speicherseiten in den angegebenen Adressbereichen verfügbar sind oder dass für die MDL selbst nicht genügend Speicherpool vorhanden ist. |
Bemerkungen
Standardmäßig sind die physischen Speicherseiten , die mmAllocatePagesForMdlEx zurückgeben, nicht zusammenhängende Seiten. Ab Windows 7 können Aufrufer 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.
MmAllocatePagesForMdlEx 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 zugeordnet ist (z. B. eine AGP-Grafikkarte).
Je nachdem, wie viel physischer Arbeitsspeicher derzeit in den angeforderten Bereichen verfügbar ist, gibt MmAllocatePagesForMdlEx- möglicherweise eine MDL zurück, die weniger Arbeitsspeicher beschreibt als angefordert wurde. Die Routine kann auch NULL- zurückgeben, wenn kein Speicher zugewiesen wurde. Der Aufrufer sollte die Menge des Arbeitsspeichers überprüfen, der tatsächlich der MDL zugeordnet ist.
Der Aufrufer muss MmFreePagesFromMdl- verwenden, um die Speicherseiten freizugeben, die von einer MDL beschrieben werden, die von MmAllocatePagesForMdlExerstellt wurde. Nach dem Aufrufen MmFreePagesFromMdlmuss der Aufrufer auch ExFreePool- aufrufen, um den Speicher freizugeben, der für die MDL-Struktur zugeordnet ist.
Standardmäßig füllt MmAllocatePagesForMdlEx 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 MmAllocatePagesForMdlEx zugewiesen wird, ist 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 MmAllocatePagesForMdlEx- 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.
MmAllocatePagesForMdlEx wird bei IRQL <= APC_LEVEL ausgeführt. Anrufer von MmAllocatePagesForMdlEx- dürfen DISPATCH_LEVEL sein. Sie können jedoch die Treiberleistung verbessern, indem Sie APC_LEVEL oder unten aufrufen.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | Siehe Abschnitt "Hinweise". |
DDI-Complianceregeln | IrqlMmApcLte(wdm) |