Freigeben über


MmAllocateContiguousNodeMemory-Funktion (ntddk.h)

Die MmAllocateContiguousNodeMemory Routine weist einen Bereich zusammenhängender, nichtpageierter physischer 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 Zuteilungsspeicherblocks in Bytes. Weitere Informationen finden Sie in den Hinweisen.

[in] LowestAcceptableAddress

Die niedrigste gültige physische Adresse, die der Anrufer verwenden kann. Wenn ein Gerät beispielsweise nur Speicherorte über den ersten 8 Mb des physischen Speicheradressenbereichs 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 Anrufer verwenden kann. Wenn ein Gerät beispielsweise nur Speicherorte in den ersten 16 Mb des physischen Speicheradressenbereichs des Prozessors adressieren kann, sollte der Treiber für dieses Gerät HighestAcceptableAddress auf 0x0000000000FFFFFF festlegen.

[in, optional] BoundaryAddressMultiple

Die physische Adresse mehrerer, die der zugeordnete Puffer nicht überschreiten darf. Eine physische Adresse muss immer eine Potenz von zwei sein. Dieser Parameter ist optional und kann als Null angegeben werden, um anzugeben, dass das Gerät keine besonderen Speicherbeschränkungen aufweist. Weitere Informationen finden Sie in den Hinweisen.

[in] Protect

Kennzeichnen Sie Bits, die den Schutz angeben, der für den zugewiesenen Speicher verwendet werden soll. Der Aufrufer muss im parameter Protect parameter ein (aber nicht beides) der folgenden Flagbits festlegen.

Flagbit Bedeutung
PAGE_READWRITE Weisen Sie Lese-/Schreibzugriff, no-execute -Speicher (NX) zu. Die meisten Anrufer 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 anweisungen im zugewiesenen Speicher ausführen muss.

Darüber hinaus kann der Aufrufer eine (aber nicht beide) der folgenden optionalen Flagbits im parameter Protect festlegen.

Flagbit Bedeutung
PAGE_NOCACHE Weisen Sie nicht zwischengespeicherten Speicher zu. Dieses Flagbit ähnelt dem Aufrufen MmAllocateContiguousMemorySpecifyCache- mit CacheType- auf MmNonCachedfestgelegt ist.
PAGE_WRITECOMBINE Weisen Sie den kombinierten Arbeitsspeicher zu. Dieses Flagbit ähnelt dem Aufrufen MmAllocateContiguousMemorySpecifyCache mit CacheType- auf MmWriteCombined-festgelegt ist.

Wenn weder PAGE_NOCACHE noch PAGE_WRITECOMBINE angegeben werden, wird der zugeordnete Speicher vollständig zwischengespeichert. In diesem Fall ähnelt der Effekt dem Aufrufen MmAllocateContiguousMemorySpecifyCache mit CacheType- auf MmCached-festgelegt.

[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, von welchem Knoten Speicher zugewiesen werden soll. Andernfalls gibt die Routine NULL-zurück, wenn der Speicher im angegebenen Adressbereich nicht vom bevorzugten Knoten zugeordnet werden kann.

Rückgabewert

MmAllocateContiguousNodeMemory gibt die virtuelle Basisadresse für den zugewiesenen Speicher zurück. Wenn die Anforderung nicht erfüllt werden kann, gibt die Routine NULL-zurück.

Bemerkungen

Ein Kernelmodusgerätetreiber ruft diese Routine auf, um einen zusammenhängenden Block physischen Speichers zuzuweisen. Der aufrufende Treiber kann angeben, ob für die Zuordnung kein Ausführungsspeicher (NO-Execute, NX) verwendet werden soll. In einem nicht uniform memory access (NUMA)-Multiprozessorsystem kann der Aufrufer einen bevorzugten Knoten angeben, von dem der Speicher zugewiesen werden soll. Ein Knoten ist eine Sammlung von Prozessoren, die schnellen Zugriff auf einen Speicherbereich teilen. In einem Nicht-NUMA-Multiprozessor oder einem Einzelprozessorsystem behandelt MmAllocateContiguousNodeMemory den gesamten Speicher als Zugehörigkeit zu einem einzelnen Knoten und weist Speicher von diesem Knoten zu.

MmAllocateContiguousNodeMemory ordnet einen Block nicht seitenseitigen Speichers zu, der im physischen Adressraum zusammenhängend ist. Die Routine ordnet diesen Block einem zusammenhängenden Block des virtuellen Speichers im Systemadressraum zu und gibt die virtuelle Adresse der Basis dieses Blocks zurück. Die Routine richtet die Startadresse einer zusammenhängenden Speicherzuordnung an eine 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 ihrer angeforderten Zuordnung und der nächsten Seitengrenze sicher Arbeitsspeicher verwenden können.

Da zusammenhängender physischer Speicher in der Regel in kurzer Versorgung liegt, sollte er sparsam und nur bei Bedarf verwendet werden. Ein Treiber, der zusammenhängenden Speicher verwenden muss, sollte diesen Speicher während der Treiberinitialisierung zuweisen, da der physische Speicher wahrscheinlich im Laufe der Zeit fragmentiert wird, da das Betriebssystem Speicher zuweist 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 direkt vor dem Entladen des Treibers frei.

Der von MmAllocateContiguousNodeMemory zugeordnete Speicher muss freigegeben werden, wenn der Arbeitsspeicher nicht mehr benötigt wird. Rufen Sie die MmFreeContiguousMemory Routine auf, um Arbeitsspeicher freizugeben, der von MmAllocateContiguousNodeMemoryzugewiesen wird.

MmAllocateContiguousNodeMemory ähnelt der MmAllocateContiguousMemorySpecifyCacheNode Routine. Im Gegensatz zu MmAllocateContiguousMemorySpecifyCacheNodekann MmAllocateContiguousNodeMemory verwendet werden, um keine Ausführungsspeicher (NX) zuzuweisen. Als bewährte Methode sollte ein Treiber NX-Speicher zuweisen, es sei denn, der Treiber erfordert explizit die Möglichkeit, Anweisungen im zugewiesenen Speicher auszuführen. Durch die Zuweisung von NX-Speicher verbessert ein Treiber die Sicherheit, indem schädliche Software keine Anweisungen in diesem Speicher ausführt. Der vom MmAllocateContiguousMemoryzugeordnete Speicher MmAllocateContiguousMemorySpecifyCacheund MmAllocateContiguousMemorySpecifyCacheNode Routinen sind immer ausführbare Dateien.

Wenn Sie einen Wert ungleich Null für den parameter BoundaryAddressMultiple angeben, überschreitet der physische Adressbereich des zugewiesenen 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 16 Mb physische Grenzen übertragen kann, sollte der Treiber einen Wert von 0x1000000 für diesen Parameter angeben, um sicherzustellen, dass die Adressen, die das Gerät sieht, nicht um eine Grenze von 16 MB herumbrechen.

Speicher, der MmAllocateContiguousNodeMemory zugeordnet wird, wird nicht initialisiert. Ein Kernelmodustreiber muss zuerst diesen Speicher null sein, wenn er für Software im Benutzermodus sichtbar macht (um zu vermeiden, dass potenziell privilegierte Inhalte verloren gehen).

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Verfügbar ab Windows 8.
Zielplattform- Universal
Header- ntddk.h (enthalten Wdm.h, Ntddk.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- IRQL-<= DISPATCH_LEVEL

Siehe auch

DriverEntry-

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory