MmAllocateContiguousMemory-Funktion (ntddk.h)
Die MmAllocateContiguousMemory Routine weist einen Bereich zusammenhängender, nichtpageierter physischer 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 Zuteilungsspeicherblocks in Bytes. Weitere Informationen finden Sie in den Hinweisen.
[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.
Rückgabewert
MmAllocateContiguousMemory 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
MmAllocateContiguousMemory ordnet einen Block des nicht seitenfreien 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 MmAllocateContiguousMemory- 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 MmAllocateContiguousMemory zugeordnete Speicher muss freigegeben werden, wenn der Speicher nicht mehr benötigt wird. Rufen Sie die MmFreeContiguousMemory Routine auf, um Arbeitsspeicher freizugeben, der von MmAllocateContiguousMemoryzugewiesen wird.
Wenn der physische Arbeitsspeicher auf einem Computer mit einer großen Menge RAM fragmentiert ist, können Aufrufe an MmAllocateContiguousMemory, die erfordern, dass das Betriebssystem nach zusammenhängenden Speicherblöcken sucht, die Leistung stark beeinträchtigen. 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 MmAllocateContiguousMemoryvermeiden. Stattdessen sollten Treiber alle erforderlichen zusammenhängenden Puffer in ihren DriverEntry- Routinen zuordnen und diese Puffer wiederverwenden.
Speicher, der MmAllocateContiguousMemory zugeordnet wird, ist nicht initialisiert. Ein Kernelmodustreiber muss diesen Speicher zuerst auf Null festlegen, wenn er für Die Software im Benutzermodus sichtbar wird (um zu vermeiden, dass potenziell privilegierte Inhalte verloren gehen).
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Ab Windows 2000 verfügbar. |
Zielplattform- | Universal |
Header- | ntddk.h (enthalten Wdm.h, Ntddk.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | IRQL-<= DISPATCH_LEVEL |