MmAllocateContiguousNodeMemory-Funktion (wdm.h)
Die MmAllocateContiguousNodeMemory-Routine ordnet einen Bereich von zusammenhängendem, nicht auslagerten physischen Speicher zu und ordnet ihn dem Systemadressraum zu.
Syntax
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
);
Parameter
[in] NumberOfBytes
Die Größe des zuzuordnenden Blocks des zusammenhängenden Arbeitsspeichers in Bytes. Weitere Informationen finden Sie in den Hinweisen.
[in] LowestAcceptableAddress
Die niedrigste gültige physische Adresse, die der Aufrufer verwenden kann. Wenn ein Gerät beispielsweise nur Standorte oberhalb der ersten 8 Megabyte des Adressbereichs des physischen Arbeitsspeichers des Prozessors adressieren kann, sollte der Treiber für dieses Gerät LowestAcceptableAddress auf 0x0000000000800000 festlegen.
[in] HighestAcceptableAddress
Die höchste gültige physische Adresse, die der Aufrufer verwenden kann. Wenn ein Gerät beispielsweise nur Standorte in den ersten 16 Mb des Adressbereichs des physischen Arbeitsspeichers des Prozessors adressieren kann, sollte der Treiber für dieses Gerät HighestAcceptableAddress auf 0x0000000000FFFFFF festlegen.
[in, optional] BoundaryAddressMultiple
Das physische Adressmultimal, das der zugeordnete Puffer nicht überschreiten darf. Ein physisches Adressmultimal muss immer eine Potenz von zwei sein. Dieser Parameter ist optional und kann als 0 (null) angegeben werden, um anzugeben, dass das Gerät keine besonderen Einschränkungen für die Speichergrenze aufweist. Weitere Informationen finden Sie in den Hinweisen.
[in] Protect
Flagbits, die den schutz angeben, der für den zugeordneten Arbeitsspeicher verwendet werden soll. Der Aufrufer muss ein (aber nicht beides) der folgenden Flagbits im Protect-Parameter festlegen.
Flag-Bit | Bedeutung |
---|---|
PAGE_READWRITE | Zuordnen von Lese-/Schreibzugriff, No-Execute-Arbeitsspeicher (NX). Die meisten Aufrufer sollten dieses Flagbit festlegen. Weitere Informationen finden Sie in den Hinweisen. |
PAGE_EXECUTE_READWRITE | Weisen Sie Lese-/Schreibspeicher zu, der ausführbar ist. Dieses Flagbit sollte nur festgelegt werden, wenn der Aufrufer die Fähigkeit benötigt, Anweisungen im zugeordneten Arbeitsspeicher auszuführen. |
Darüber hinaus kann der Aufrufer ein (aber nicht beides) der folgenden optionalen Flagbits im Protect-Parameter festlegen.
Flag-Bit | Bedeutung |
---|---|
PAGE_NOCACHE | Zuordnen von nicht zwischengespeichertem Arbeitsspeicher. Dieses Flagbit ähnelt dem Aufrufen von MmAllocateContiguousMemorySpecifyCache , wobei CacheType auf MmNonCached festgelegt ist. |
PAGE_WRITECOMBINE | Zuordnen von kombiniertem Schreibspeicher. Dieses Flagbit ähnelt dem Aufrufen von MmAllocateContiguousMemorySpecifyCache , wobei CacheType auf MmWriteCombined festgelegt ist. |
Wenn weder PAGE_NOCACHE noch PAGE_WRITECOMBINE angegeben wird, wird der zugeordnete Arbeitsspeicher vollständig zwischengespeichert. In diesem Fall ähnelt der Effekt dem Aufrufen von MmAllocateContiguousMemorySpecifyCache , wobei CacheType auf MmCached festgelegt ist.
[in] PreferredNode
Die bevorzugte Knotennummer. Wenn ein Multiprozessorsystem N-Knoten enthält, werden die Knoten von 0 bis N-1 nummeriert. Wenn der Aufrufer PreferredNode auf MM_ANY_NODE_OK festlegt, wählt die Routine aus, aus welchem Knoten Arbeitsspeicher zugeordnet werden soll. Andernfalls gibt die Routine NULL zurück, wenn arbeitsspeicher im angegebenen Adressbereich nicht vom bevorzugten Knoten zugeordnet werden kann.
Rückgabewert
MmAllocateContiguousNodeMemory gibt die virtuelle Basisadresse für den zugeordneten Arbeitsspeicher zurück. Wenn die Anforderung nicht erfüllt werden kann, gibt die Routine NULL zurück.
Hinweise
Ein Gerätetreiber im Kernelmodus ruft diese Routine auf, um einen zusammenhängenden Block des physischen Speichers zuzuweisen. Der aufrufende Treiber kann angeben, ob NX-Arbeitsspeicher (No-Execute) für die Zuordnung verwendet werden soll. In einem NUMA-Multiprozessorsystem (Non-Uniform Memory Access) kann der Aufrufer einen bevorzugten 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 MmAllocateContiguousNodeMemory den gesamten Arbeitsspeicher als gehört zu einem einzelnen Knoten und ordnet Arbeitsspeicher von diesem Knoten zu.
MmAllocateContiguousNodeMemory weist einen Block von nicht auslagerten Arbeitsspeicher zu, der im physischen Adressraum zusammenhängend ist. Die Routine ordnet diesen Block einem zusammenhängenden Virtuellen Speicherblock im Systemadressraum zu und gibt die virtuelle Adresse der Basis dieses Blocks zurück. Die Routine richtet die Startadresse einer zusammenhängenden Speicherbelegung an einer Speicherseitengrenze aus.
Treiber dürfen nicht über die angeforderte Zuordnungsgröße hinaus auf den Arbeitsspeicher zugreifen. Entwickler sollten beispielsweise nicht davon ausgehen, dass ihre Treiber zwischen dem Ende der angeforderten Zuordnung und der Nächsten Seitengrenze sicher Arbeitsspeicher verwenden können.
Da zusammenhängender physischer Arbeitsspeicher in der Regel knapp ist, sollte er sparsam und nur bei Bedarf verwendet werden. Ein Treiber, der zusammenhängenden Arbeitsspeicher verwenden muss, sollte diesen Arbeitsspeicher während der Treiberinitialisierung zuordnen, da physischer Arbeitsspeicher wahrscheinlich im Laufe der Zeit fragmentiert wird, wenn das Betriebssystem Arbeitsspeicher zuordnet und freigibt. In der Regel ruft ein Treiber MmAllocateContiguousNodeMemory aus seiner DriverEntry-Routine auf, um einen internen Puffer für die langfristige Verwendung zuzuweisen, und gibt den Puffer kurz vor dem Entladen des Treibers frei.
Der von MmAllocateContiguousNodeMemory zugeordnete Arbeitsspeicher muss freigegeben werden, wenn der Arbeitsspeicher nicht mehr benötigt wird. Rufen Sie die MmFreeContiguousMemory-Routine auf, um Arbeitsspeicher freizugeben, der von MmAllocateContiguousNodeMemory zugeordnet wird.
MmAllocateContiguousNodeMemory ähnelt der MmAllocateContiguousMemorySpecifyCacheNode-Routine . Im Gegensatz zu MmAllocateContiguousMemorySpecifyCacheNode kann MmAllocateContiguousNodeMemory verwendet werden, um NX-Arbeitsspeicher (No-Execute) zuzuweisen. Als bewährte Methode sollte ein Treiber NX-Speicher zuordnen, es sei denn, der Treiber erfordert explizit die Fähigkeit, Anweisungen im zugeordneten Speicher auszuführen. Durch die Zuweisung von NX-Speicher verbessert ein Treiber die Sicherheit, indem er verhindert, dass Schadsoftware Anweisungen in diesem Speicher ausführt. Der von den Routinen MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache und MmAllocateContiguousMemorySpecifyCacheNode zugeordnete Arbeitsspeicher ist immer ausführbar.
Wenn Sie einen Wert ungleich Null für den Parameter BoundaryAddressMultiple angeben, überschreitet der physische Adressbereich des zugeordneten Speicherblocks keine Adressgrenze, die ein ganzzahliges Vielfaches dieses Werts ist. Ein Treiber sollte diesen Parameter auf Null festlegen, es sei denn, ein Wert ungleich null ist erforderlich, um eine Hardwareeinschränkung zu umgehen. Wenn ein Gerät beispielsweise keine Daten über physische Grenzen von 16 Megabyte übertragen kann, sollte der Treiber für diesen Parameter den Wert 0x1000000 angeben, um sicherzustellen, dass die dem Gerät angezeigten Adressen nicht an einer Grenze von 16 Megabyte umschließen.
Der Von MmAllocateContiguousNodeMemory zugeordnete Arbeitsspeicher wird nicht initialisiert. Ein Kernelmodustreiber muss diesen Arbeitsspeicher zuerst null, wenn er für Software im Benutzermodus sichtbar wird (um zu verhindern, dass potenziell privilegierte Inhalte verloren gehen).
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Verfügbar ab Windows 8. |
Zielplattform | Universell |
Header | wdm.h (include Wdm.h, Ntddk.h) |
Bibliothek | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
Weitere Informationen
MmAllocateContiguousMemorySpecifyCache