Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die AllocateCommonBuffer Routine weist Arbeitsspeicher zu und ordnet sie zu, sodass sie sowohl vom Prozessor als auch von einem Gerät für DMA-Vorgänge gleichzeitig zugänglich ist.
Syntax
PALLOCATE_COMMON_BUFFER PallocateCommonBuffer;
PVOID PallocateCommonBuffer(
[in] PDMA_ADAPTER DmaAdapter,
[in] ULONG Length,
[out] PPHYSICAL_ADDRESS LogicalAddress,
[in] BOOLEAN CacheEnabled
)
{...}
Parameter
[in] DmaAdapter
Zeiger auf die DMA_ADAPTER Struktur, die von IoGetDmaAdapter zurückgegeben wird, die den Busmasteradapter oder DMA-Controller darstellt.
[in] Length
Gibt die Anzahl der zuzuordnenden Bytes an.
[out] LogicalAddress
Zeiger auf eine Variable, die die logische Adresse empfängt, die das Gerät für den Zugriff auf den zugewiesenen Puffer verwenden kann. Verwenden Sie diese Adresse, anstatt MmGetPhysicalAddress aufzurufen, da das System plattformspezifische Speichereinschränkungen berücksichtigen kann.
[in] CacheEnabled
Gibt an, ob der zugeordnete Arbeitsspeicher zwischengespeichert werden kann.
Dieser Parameter wird ignoriert. Das Betriebssystem bestimmt, ob zwischengespeicherter Speicher im allgemeinen Puffer aktiviert werden soll, der zugewiesen werden soll. Diese Entscheidung basiert auf der Prozessorarchitektur und dem Gerätebus.
Auf Computern mit x86-basierten, x64-basierten und Itanium-basierten Prozessoren ist der zwischengespeicherte Speicher aktiviert. Es wird davon ausgegangen, dass alle DMA-Vorgänge, die von einem Gerät ausgeführt werden, mit den relevanten CPU-Caches in Einklang stehen, was möglicherweise das Zwischenspeichern dieses Speichers sein kann. Wenn Ihr Treiber die Zwischenspeicherung deaktivieren muss, rufen Sie stattdessen AllocateCommonBufferEx- auf.
Auf Computern mit ARM- oder ARM 64-basierten Prozessoren aktiviert das Betriebssystem nicht automatisch zwischengespeicherten Speicher für alle Geräte. Das System basiert auf der ACPI_CCA Methode für jedes Gerät, um zu bestimmen, ob das Gerät zwischengespeichert ist.
Rückgabewert
AllocateCommonBuffer die virtuelle Basisadresse des zugewiesenen Bereichs zurück. Wenn der Puffer nicht zugeordnet werden kann, wird NULL-zurückgegeben.
Bemerkungen
AllocateCommonBuffer ist keine Systemroutine, die direkt nach Namen aufgerufen werden kann. Diese Routine kann nur durch Zeiger von der in einer DMA_OPERATIONS Struktur zurückgegebenen Adresse aufgerufen werden. Treiber rufen die Adresse dieser Routine ab, indem sie IoGetDmaAdapteraufruft.
AllocateCommonBuffer unterstützt DMA, bei dem das Gerät und der Prozessor kontinuierlich über den Systemspeicher kommunizieren, wie in einer Steuerungsstruktur für ein Busmaster-DMA-Gerät.
AllocateCommonBuffer unterstützt auch untergeordnete Geräte, deren Treiber den Autoinitialisierungsmodus eines DMA-Controllers verwenden.
AllocateCommonBuffer führt folgende Aktionen aus:
- Weist Arbeitsspeicher zu, der sowohl vom Prozessor als auch vom Gerät erreicht werden kann. Dieser Speicher wird mit dem Gerät zusammenhängend angezeigt.
- Ordnet Kartenregister zu, um den Puffer zuzuordnen, falls vom System erforderlich.
- Richtet bei Bedarf eine Übersetzung für das Gerät ein, einschließlich laden von Kartenregistern.
Wenn ein Treiber mehrere Seiten mit gemeinsamem Pufferraum benötigt, die Seiten jedoch nicht zusammenhängend sein müssen, sollte der Treiber mehrere Einzelseitenanforderungen an AllocateCommonBuffer anstelle einer großen Anforderung vornehmen. Dieser Ansatz spart zusammenhängenden Speicher.
Treiber rufen in der Regel AllocateCommonBuffer als Teil des Gerätestarts auf, während der Antwort auf eine PnP-IRP_MN_START_DEVICE Anforderung. Nach dem Start ist es möglich, dass nur einseitige Anforderungen erfolgreich sein werden, falls vorhanden.
Anforderungen
| Anforderung | Wert |
|---|---|
| mindestens unterstützte Client- | Ab Windows 2000 verfügbar. |
| Zielplattform- | Desktop |
| Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
| IRQL- | PASSIVE_LEVEL |
| DDI-Complianceregeln | IrqlDispatch(wdm) |