Freigeben über


PALLOCATE_COMMON_BUFFER Rückruffunktion (wdm.h)

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.
Um den speicherbasierten Systemspeicher wirtschaftlich zu verwenden, sollten Treiber möglichst wenige dieser Puffer pro Gerät zuordnen. AllocateCommonBuffer mindestens eine Speicherseite zuordnet, unabhängig von der angeforderten Length. Nach einer erfolgreichen Zuordnung, die weniger als PAGE_SIZE Bytes anfordert, kann der Aufrufer nur auf die angeforderte Lengthzugreifen. Nach einer erfolgreichen Zuordnung, die mehr als ein integrales Vielfaches von PAGE_SIZE Bytes anfordert, sind alle verbleibenden Bytes auf der letzten zugeordneten Seite für den Aufrufer nicht zugänglich.

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)

Siehe auch

DMA_ADAPTER

DMA_OPERATIONS

FreeCommonBuffer

IoGetDmaAdapter-