MmAllocateContiguousMemorySpecifyCache-Funktion (wdm.h)
Die MmAllocateContiguousMemorySpecifyCache-Routine weist einen Bereich zusammenhängenden, nicht ausseitigen physischen Arbeitsspeicher 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 Zuteilungsblocks 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 Mb 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 Megabyte 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 Adress-Vielfaches, das der zugeordnete Puffer nicht kreuzen darf. Ein physisches Adressmultimal muss immer eine Leistung von zwei sein. Dieser Parameter ist optional und kann als Null angegeben werden, um anzugeben, dass das Gerät keine besonderen Speichereinschrä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 Arbeitsspeicher zurück. Wenn das System den angeforderten Puffer nicht zuordnen kann, gibt die Routine NULL zurück.
Hinweise
MmAllocateContiguousMemorySpecifyCache weist einen Block des nicht auslagerten Arbeitsspeichers zu, der im physischen Adressraum zusammenhängend ist. Die Routine ordnet diesen Block einem zusammenhängenden Block des virtuellen Arbeitsspeichers 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 Arbeitsspeicher zugreifen. Entwickler sollten beispielsweise nicht davon ausgehen, dass ihre Treiber zwischen dem Ende der angeforderten Zuordnung und der Grenze der nächsten Seite 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 der physische Arbeitsspeicher wahrscheinlich im Laufe der Zeit fragmentiert wird, wenn das Betriebssystem Arbeitsspeicher zuweist und freigibt. In der Regel ruft ein Treiber MmAllocateContiguousMemorySpecifyCache über seine 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 MmAllocateContiguousMemorySpecifyCache zugewiesene Arbeitsspeicher muss freigegeben werden, wenn der Arbeitsspeicher nicht mehr benötigt wird. Rufen Sie die MmFreeContiguousMemory-Routine auf, um Arbeitsspeicher freizugeben, der von MmAllocateContiguousMemorySpecifyCache zugewiesen wird.
Wenn Sie einen nonzero-Wert 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 0 festlegen, es sei denn, ein Wert ohne Zero 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 einen Wert von 0x1000000 für diesen Parameter angeben, um sicherzustellen, dass die Adressen, die dem Gerät angezeigt werden, nicht an einer Grenze von 16 Megabyte umschließen.
Wenn Sie die MmAllocateContiguousMemorySpecifyCache-Routine auf Computern mit großem Arbeitsspeicher verwenden, kann die Leistung des Betriebssystems stark beeinträchtigt werden, wenn das System versucht, einen zusammenhängenden Speicherabschnitt zu erstellen. Diese Beeinträchtigung 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 MmAllocateContiguousMemorySpecifyCache vermeiden. Stattdessen sollten Treiber alle erforderlichen zusammenhängenden Puffer in ihren DriverEntry-Routinen zuordnen und diese Puffer wiederverwenden.
Der Von MmAllocateContiguousMemorySpecifyCache zugewiesene Arbeitsspeicher ist nicht initialisiert. Ein Kernelmodustreiber muss diesen Arbeitsspeicher zuerst null, wenn er für Software im Benutzermodus sichtbar macht (um zu vermeiden, dass potenziell privilegierte Inhalte verloren gehen).
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Universell |
Header | wdm.h (include Wdm.h, Ntddk.h) |
Bibliothek | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |