Freigeben über


Abrufen eines Adapterobjekts

Beim Gerätestart ruft ein Treiber, der system- oder bus-master DMA verwendet, IoGetDmaAdapter auf, um einen Zeiger auf ein Adapterobjekt abzurufen und die maximale Anzahl von Kartenregistern zu bestimmen, die für jeden Übertragungsvorgang verfügbar sind. Wenn ein Treiber IoGetDmaAdapter aufruft, ruft der E/A-Manager wiederum die HAL auf, um die erforderlichen plattformspezifischen Informationen abzurufen.

Ein Treiber muss bestimmte Informationen in einer systemdefinierten DEVICE_DESCRIPTION-Struktur in seinem Aufruf von IoGetDmaAdapter bereitstellen. Treiber müssen rtlZeroMemory verwenden, um die DEVICE_DESCRIPTION-Struktur mit Nullen zu initialisieren, bevor sie Werte festlegen.

Die erforderlichen Daten enthalten Informationen zu den Features des Treibergeräts, z. B. ob es sich bei dem Gerät um einen Bus master handelt, ob es über Scatter-/Gather-Funktionen verfügt und wie viele Bytes daten das Gerät gleichzeitig übertragen kann (MaximumLength).

Die erforderlichen Gerätebeschreibungsdaten enthalten auch plattformspezifische Informationen, z. B. die plattformspezifische und systemseitig zugewiesene Nummer des Busses, die ein Treiber eines Bus-master-Geräts steuert. Ein Treiber kann diese Informationen abrufen, indem er IoGetDeviceProperty aufruft.

Die DEVICE_DESCRIPTION-Struktur enthält einige Felder, die für einige DMA-Geräte oder Treiber irrelevant sein können. Beispielsweise wird das Feld BusNumber in WDM-Treibern nicht verwendet. Jeder Treiber sollte Werte für die relevanten Strukturmember bereitstellen und die Werte für alle anderen Member auf 0 festlegen.

Der Treiber eines untergeordneten Geräts sollte TRUE nicht im ScatterGather-Feld übergeben, es sei denn, das Gerät kann warten, bis der System-DMA-Controller neu programmiert wird, wenn eine Anforderung in zwei oder mehr DMA-Vorgänge unterteilt werden muss.

IoGetDmaAdapter gibt sowohl einen Zeiger auf ein Adapterobjekt als auch einen plattformspezifischen oder gerätespezifischen Wert zurück, der angibt, wie viele Kartenregister mit dem Adapterobjekt für jeden DMA-Übertragungsvorgang verfügbar sind.

Das zurückgegebene Adapterobjekt enthält drei Felder, auf die Treiber zugreifen können:

Die DMA_OPERATIONS-Struktur enthält eine Tabelle mit Zeigern auf Funktionen, die der Treiber zum Ausführen von DMA-Vorgängen auf seinem Gerät verwenden muss. Auf die Funktionen kann nur über die Zeiger in dieser Datenstruktur zugegriffen werden. Ein Treiber kann sie nicht direkt nach Namen aufrufen. (Beachten Sie, dass diese Routinen HalXxx-Routinen ersetzen, die in früheren Versionen von Windows NT unterstützt wurden. Um die Kompatibilität für Legacytreiber sicherzustellen, stellen die Headerdateien Wdm.h und Ntddk.h Makros mit den veralteten Namen bereit, aber neue Treiber sollten die Funktionen immer über die Datenstruktur aufrufen.)

Die Anzahl der Kartenregister kann von Gerät zu Gerät und von Plattform zu Plattform variieren. Im Allgemeinen weist die HAL eine Reihe von Kartenregistern nach den folgenden Kriterien zu:

  • Wenn möglich, gibt die HAL einen Wert zurück, der ein Wert mehr ist als die Anzahl der Kartenregister, die zum Übertragen von MaximumLength-Bytes erforderlich sind, wie im Aufruf des Treibers für IoGetDmaAdapter angegeben.

  • Andernfalls gibt die HAL einen kleineren Wert zurück, der für die jeweilige Plattform so groß wie möglich ist.

Mit anderen Worten, die HAL gibt jedem Treiber in der Regel genügend Kartenregister, um den DMA-Durchsatz für sein Gerät zu maximieren, aber die HAL kann auf einigen Windows-Plattformen einen geringeren Wert zurückgeben. Es gibt keine Garantie, dass ein Treiber die Anzahl der angeforderten Kartenregister erhält, daher sollten Treiber immer den zurückgegebenen Wert überprüfen.

Jeder DMA-Gerätetreiber muss Speicher für den Adapterobjektzeiger und den Wert NumberOfMapRegisters bereitstellen, der von IoGetDmaAdapter zurückgegeben wird. Dieser Zeiger ist ein erforderlicher Parameter auf die vom System bereitgestellten Supportroutinen, die für DMA verwendet werden. Da viele dieser Supportroutinen unter IRQL = DISPATCH_LEVEL aufgerufen werden müssen, muss der vom Treiber zugewiesene Speicher resident sein. Die meisten DMA-Treiber stellen den erforderlichen Speicher in einer Geräteerweiterung bereit. Der Speicher kann sich jedoch in einer Controllererweiterung befinden, wenn der Treiber auch ein Controllerobjekt verwendet, oder in einem nicht ausgelagerten Pool, der vom Treiber zugewiesen wird. Weitere Informationen finden Sie unter Zuweisen System-Space Arbeitsspeichers und Verwalten von Hardwareprioritäten .

Wenn der Treiber alle DMA-Vorgänge abgeschlossen hat, ruft er PutDmaAdapter auf, um das Adapterobjekt freizusetzen.

In den folgenden Abschnitten Using System DMA and Using Bus-Master DMA) wird beschrieben, wie monolithische Treiber von DMA-Geräten Supportroutinen verwenden, um Übertragungsanforderungen zu erfüllen. In diesen Abschnitten wird davon ausgegangen, dass der Treiber folgendes aufweist:

  • Eine StartIo-Standardroutine anstelle des Einrichtens und Verwaltens einer internen Warteschlange mit IRPs

  • Eine interne Routine zum Aufteilen von Übertragungsanforderungen, für die eine unzureichende Anzahl von Kartenregistern verfügbar ist

  • Keine gerätespezifischen DMA-Einschränkungen

Mit anderen Worten, in diesen Abschnitten wird die einfachste Technik für DMA-Vorgänge von Treibern beschrieben, aber einzelne Treiber verwenden nicht unbedingt genau die gleichen Techniken. Welche Treiberroutinen große DMA-Übertragungsanforderungen für jeden Treiber eines DMA-Geräts aufteilen sollten, hängt vom Treibermodell (Klasse/Port oder monolithisch), von den Gerätefeatures und den gerätespezifischen DMA-Einschränkungen ab, die der Treiber verarbeiten muss.