Freigeben über


MmAllocateContiguousMemory-Funktion (ntddk.h)

Die MmAllocateContiguousMemory-Routine ordnet einen Bereich von zusammenhängendem, nicht auslagerten physischen Speicher zu und ordnet ihn dem Systemadressraum zu.

Syntax

PVOID MmAllocateContiguousMemory(
  [in] SIZE_T           NumberOfBytes,
  [in] PHYSICAL_ADDRESS HighestAcceptableAddress
);

Parameter

[in] NumberOfBytes

Die Größe des zuzuordnenden Blocks des zusammenhängenden Arbeitsspeichers in Bytes. Weitere Informationen finden Sie in den Hinweisen.

[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.

Rückgabewert

MmAllocateContiguousMemory 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

MmAllocateContiguousMemory 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 MmAllocateContiguousMemory 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 MmAllocateContiguousMemory zugeordnete Arbeitsspeicher muss freigegeben werden, wenn der Arbeitsspeicher nicht mehr benötigt wird. Rufen Sie die MmFreeContiguousMemory-Routine auf, um Arbeitsspeicher freizugeben, der von MmAllocateContiguousMemory zugeordnet wird.

Wenn physischer Arbeitsspeicher auf einem Computer fragmentiert ist, der über eine große Ram-Menge verfügt, können Aufrufe von MmAllocateContiguousMemory, bei denen das Betriebssystem nach zusammenhängenden Speicherblöcken suchen muss, die Leistung erheblich beeinträchtigen. Diese Beeinträchtigung wird ab Windows Vista SP1 und Windows Server 2008 erheblich reduziert, aber die Zuordnung von zusammenhängendem Arbeitsspeicher kann immer noch teuer sein. Aus diesem Grund sollten Treiber wiederholte Aufrufe von MmAllocateContiguousMemory vermeiden. Stattdessen sollten Treiber alle erforderlichen zusammenhängenden Puffer in ihren DriverEntry-Routinen zuordnen und diese Puffer wiederverwenden.

Der Von MmAllocateContiguousMemory zugeordnete Arbeitsspeicher wird nicht initialisiert. Ein Kernelmodustreiber muss diesen Arbeitsspeicher zuerst auf 0 (null) festlegen, wenn er ihn für Benutzermodussoftware sichtbar macht (um zu vermeiden, dass potenziell privilegierte Inhalte verloren gehen).

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar ab Windows 2000.
Zielplattform Universell
Header ntddk.h (include Wdm.h, Ntddk.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Weitere Informationen

AllocateCommonBuffer

DriverEntry

MmAllocateContiguousMemorySpecifyCache

MmAllocateNonCachedMemory

MmFreeContiguousMemory