Freigeben über


MmAllocateContiguousMemorySpecifyCacheNode-Funktion (ntddk.h)

Die MmAllocateContiguousMemorySpecifyCacheNode Routine weist einen Bereich zusammenhängender, nichtpageierter physischer Speicher zu und ordnet ihn dem Systemadressraum zu.

Syntax

PVOID MmAllocateContiguousMemorySpecifyCacheNode(
  [in]           SIZE_T              NumberOfBytes,
  [in]           PHYSICAL_ADDRESS    LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS    HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS    BoundaryAddressMultiple,
  [in]           MEMORY_CACHING_TYPE CacheType,
  [in]           NODE_REQUIREMENT    PreferredNode
);

Parameter

[in] NumberOfBytes

Die Größe des Zuteilungsspeicherblocks in Bytes. Weitere Informationen finden Sie im Abschnitt Anmerkungen weiter unten.

[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] CacheType

Gibt einen MEMORY_CACHING_TYPE Wert an, der den Typ der Zwischenspeicherung angibt, der für den zusammenhängenden physischen Speicher angefordert wurde.

[in] PreferredNode

Die bevorzugte Knotennummer. Wenn ein Multiprozessorsystem N-Knoten enthält, werden die Knoten 0 bis N-1 nummeriert. Wenn MM_ANY_NODE_OK angegeben ist oder der Computer nur über einen Knoten verfügt, wird die Zuordnung von einem beliebigen Knoten erfüllt. Andernfalls wird die Zuordnung vom bevorzugten Knoten oder wenn ein zufriedenstellender Bereich vom bevorzugten Knoten nicht gefunden werden kann, wird NULL- zurückgegeben.

Rückgabewert

MmAllocateContiguousMemorySpecifyCacheNode 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. 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 MmAllocateContiguousMemorySpecifyCacheNode den gesamten Speicher als Zugehörigkeit zu einem einzelnen Knoten behandelt und Speicher von diesem Knoten zuordnet.

MmAllocateContiguousMemorySpecifyCacheNode weist einen Block von nicht seitenfreiem Speicher 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 MmAllocateContiguousMemorySpecifyCacheNode 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 MmAllocateContiguousMemorySpecifyCacheNode zugewiesene Speicher muss freigegeben werden, wenn der Speicher nicht mehr benötigt wird. Rufen Sie die MmFreeContiguousMemory Routine auf, um Arbeitsspeicher freizugeben, der von MmAllocateContiguousMemorySpecifyCacheNodezugewiesen wird.

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.

Wenn Sie die MmAllocateContiguousMemorySpecifyCacheNode Routine auf Computern mit großen Speichermengen verwenden, kann die Leistung des Betriebssystems erheblich beeinträchtigt werden, wenn das System versucht, einen zusammenhängenden Speicherabschnitt zu erstellen. Diese Verschlechterung wird ab Windows Vista SP1 und Windows Server 2008 erheblich reduziert, aber zusammenhängender Arbeitsspeicher kann immer noch teuer zuzuordnen sein. Aus diesem Grund sollten Treiber wiederholte Aufrufe von MmAllocateContiguousMemorySpecifyCacheNodevermeiden. Stattdessen sollten Treiber alle erforderlichen zusammenhängenden Puffer in ihren DriverEntry- Routinen zuordnen und diese Puffer wiederverwenden.

Speicher, der MmAllocateContiguousMemorySpecifyCacheNode zugewiesen wird, ist 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 Vista.
Zielplattform- Universal
Header- ntddk.h (enthalten Wdm.h, Ntddk.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- IRQL-<= DISPATCH_LEVEL

Siehe auch

DriverEntry-

MEMORY_CACHING_TYPE

MmFreeContiguousMemory