Freigeben über


MmAllocateContiguousMemorySpecifyCache-Funktion (wdm.h)

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

Syntax

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

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

Gibt einen MEMORY_CACHING_TYPE Wert an, der den Typ der Für den angeforderten Arbeitsspeicher zulässigen Zwischenspeicherung angibt.

Rückgabewert

MmAllocateContiguousMemorySpecifyCache gibt die virtuelle Basisadresse für den zugewiesenen Speicher zurück. Wenn das System den angeforderten Puffer nicht zuordnen kann, gibt die Routine NULL-zurück.

Bemerkungen

MmAllocateContiguousMemorySpecifyCache einen Block des nicht seitenfreien Speichers zuordnet, 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 MmAllocateContiguousMemorySpecifyCache 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 MmAllocateContiguousMemorySpecifyCache zugewiesene Speicher muss freigegeben werden, wenn der Speicher nicht mehr benötigt wird. Rufen Sie die MmFreeContiguousMemory Routine auf, um Arbeitsspeicher freizugeben, der von MmAllocateContiguousMemorySpecifyCachezugewiesen 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 MmAllocateContiguousMemorySpecifyCache Routine auf Computern mit großen Speichermengen verwenden, kann die Leistung des Betriebssystems stark 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 MmAllocateContiguousMemorySpecifyCachevermeiden. Stattdessen sollten Treiber alle erforderlichen zusammenhängenden Puffer in ihren DriverEntry- Routinen zuordnen und diese Puffer wiederverwenden.

Speicher, der MmAllocateContiguousMemorySpecifyCache 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
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <= DISPATCH_LEVEL

Siehe auch

MmAllocateContiguousMemory

MmFreeContiguousMemory