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.
Ein WavePci Miniport-Treiber muss die Zuordnungen nachverfolgen, die er vom Porttreiber empfängt. Ein WavePci Miniport-Treiber verwaltet seine Liste der Zuordnungen in einer Datenstruktur, die zwischen Treiberthreads geteilt wird. Die Treiberthreads müssen auch den Zugriff auf den DMA-Kanal teilen, um der Hardware-Queue neue Zuordnungen hinzuzufügen und abgeschlossene Zuordnungen aus der Warteschlange zu entfernen. Um Datenbeschädigungen zu verhindern, verwenden Miniporttreiber Drehsperren, um Zugriffe auf freigegebene Datenstrukturen und Peripheriegeräte zu serialisieren. Ein Spinlock schützt die freigegebene Daten- und Hardwarewarteschlange vor gleichzeitigem Zugriff durch zwei oder mehr Treiberthreads.
Bei der Entwicklung des Teils des Treibers, der Zuordnungen verwaltet, sollten Hersteller besonders auf die folgenden Punkte achten.
Drehsperren
Um potenzielle Deadlocks zu vermeiden, darf der Miniporttreiber keinen eigenen Spinlock halten, wenn Portcls.sys aufgerufen wird, um Zuordnungen zu erwerben oder freizugeben. 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 Drehungssperre freizugeben. Nachdem der GetMapping- oder ReleaseMapping-Aufruf zurückkehrt, ruft der Treiber KeAcquireSpinLock auf, um den Spinlock erneut zu erwerben. Zwischen den Aufrufen zum Freigeben und Erwerben des Spinlocks 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 Abrufen der Drehsperre klein ist, ist die Wahrscheinlichkeit, dass die Daten durch eine Rennbedingung zwischen zwei Treiberthreads beschädigt werden, ebenfalls klein. Dies bedeutet, dass die auftretenden Fehler sporadisch sind und daher schwer zu verfolgen. Nach dem Freigeben und Erwerben einer Drehverriegelung sollte ein gut geschriebener Treiber davon ausgehen, dass alle temporären Zeiger oder Indizes, die er zuvor für den Zugriff auf die Inhalte der gemeinsam genutzten Datenstrukturen verwendet hat, nicht mehr gültig sind.
IRP-Abbruch
Während der Verarbeitung eines Wiedergabe- oder Aufnahmedatenstroms kann der Abbruch eines IRPs dazu führen, dass das Betriebssystem eine oder mehrere Zuordnungen widerruft, die der Miniporttreiber erworben hat. In diesem Fall ruft der Porttreiber die IMiniportWavePciStream::RevokeMappings-Methode auf, um den Miniporttreiber zu benachrichtigen. Um die Wiedergabe von Daten aus oder das Erfassen von Daten in den widerrufenen Zuordnungen zu vermeiden, muss der Miniporttreiber die Zuordnungen sowohl aus der Softwareliste als auch aus der Hardwarewarteschlange des DMA-Controllers entfernen. Da die Softwareliste und die Hardwarewarteschlange zwischen Treiberthreads geteilt 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 freigegeben 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 verhindert, kann das Ergebnis eine Beschädigung der Daten in den Registern oder Speicherstrukturen sein, die die Warteschlange verwalten.
Ein Funktionierendes Codebeispiel finden Sie unter dem Ac97-Beispieltreiber im Windows Driver Kit (WDK).