Freigeben über


Zuverlässigkeitsprobleme für einen WavePci Miniport-Treiber

Ein WavePci-Miniporttreiber muss die Zuordnungen nachverfolgen, die er vom Porttreiber empfängt. Ein WavePci-Miniporttreiber verwaltet seine Liste der Zuordnungen in einer Datenstruktur, die von Treiberthreads gemeinsam genutzt wird. Die Treiberthreads müssen auch den Zugriff auf den DMA-Kanal gemeinsam nutzen, um der Hardwarewarteschlange neue Zuordnungen hinzuzufügen und abgeschlossene Zuordnungen aus der Warteschlange zu entfernen. Um Datenbeschädigungen zu verhindern, verwenden Miniporttreiber Spin-Sperren, um Zugriffe auf freigegebene Datenstrukturen und Peripheriegeräte zu serialisieren. Eine Spinsperre schützt die freigegebene Daten- und Hardwarewarteschlange vor dem gleichzeitigen Zugriff durch zwei oder mehr Treiberthreads.

Bei der Entwicklung des Teils des Treibers, der Zuordnungen verwaltet, sollten Anbieter besonders auf die folgenden Punkte achten.

Drehsperren

Um potenzielle Deadlocks zu vermeiden, darf der Miniporttreiber beim Aufrufen von Portcls.sys zum Abrufen oder Freigeben von Zuordnungen keine eigene Drehsperre halten. Der Ac97-Beispieltreiber im Microsoft Windows Driver Kit (WDK) veranschaulicht dieses Prinzip. Vor dem Aufrufen von IPortWavePciStream::GetMapping oder IPortWavePciStream::ReleaseMapping ruft der Beispieltreiber KeReleaseSpinLock auf, um die Spinsperre zu lösen. Nachdem der GetMapping - oder ReleaseMapping-Aufruf zurückgegeben wurde, ruft der Treiber KeAcquireSpinLock auf, um die Spinsperre erneut abzurufen. Zwischen den Aufrufen zum Freigeben und Abrufen der Spinsperre darf ein Treiberthread nicht davon ausgehen, dass er exklusiven Zugriff auf die Liste der Zuordnungen hat. Der Zugriff auf die freigegebenen Daten während dieses ungeschützten Intervalls ist gefährlich. Wenn das Intervall zwischen dem Freigeben und Dem Abrufen der Drehsperre klein ist, ist die Wahrscheinlichkeit, dass die Daten durch eine Racebedingung zwischen zwei Treiberthreads beschädigt werden, ebenfalls gering. Dies bedeutet, dass die resultierenden Ausfälle zeitweilig und daher schwer nachzuverfolgen sind. Nach dem Freigeben und Erwerben einer Spinsperre sollte ein gut geschriebener Treiber davon ausgehen, dass alle temporären Zeiger oder Indizes, die er zuvor für den Zugriff auf den Inhalt der freigegebenen Datenstrukturen verwendet hat, nicht mehr gültig sind.

IRP-Abbruch

Während der Verarbeitung eines Wiedergabe- oder Aufzeichnungsstreams kann das Abbrechen eines IRP dazu führen, dass das Betriebssystem eine oder mehrere Zuordnungen, die der Miniporttreiber erworben hat, widerrufen. In diesem Fall ruft der Porttreiber die IMiniportWavePciStream::RevokeMappings-Methode auf, um den Miniporttreiber zu benachrichtigen. Um die Wiedergabe von Daten aus den widerrufenen Zuordnungen oder das Erfassen von Daten in den widerrufenen Zuordnungen zu vermeiden, muss der Miniporttreiber die Zuordnungen sowohl aus seiner Softwareliste als auch aus der Hardwarewarteschlange des DMA-Controllers entfernen. Da die Softwareliste und die Hardwarewarteschlange zwischen Treiberthreads gemeinsam genutzt werden, ist eine gewisse Sorgfalt erforderlich, um diese Vorgänge zuverlässig auszuführen.

Beispielsweise kann eine Gruppe von zu widerrufenden Zuordnungen eine Zuordnung enthalten, die gerade freigegeben wurde oder gerade veröffentlicht werden soll. In diesem Fall können zwei Treiberthreads gleichzeitig versuchen, dieselbe Zuordnung aus der DMA-Warteschlange zu entfernen. Wenn der Treiber den gleichzeitigen Zugriff nicht verhindern kann, kann dies zu einer Beschädigung der Daten in den Registern oder Speicherstrukturen führen, die die Warteschlange verwalten.

Ein funktionierendes Codebeispiel finden Sie im Ac97-Beispieltreiber im Windows Driver Kit (WDK).