Freigeben über


DMA-Überprüfung

Die DMA-Überprüfung überwacht die Verwendung von Direct Memory Access (DMA). Da sich die DMA-Routinen mit der Entwicklung von Windows geändert haben, verwenden viele Treiber DMA-Aufrufe falsch. Darüber hinaus versuchen einige Treiberautoren, das HAL DMA-Subsystem vollständig zu umgehen. Diese Vorgehensweise kann zu schleichenden Fehlern im Treiber führen.

Die DMA-Überprüfungsoption der Treiberüberprüfung versucht, häufige DMA-Fehler abzufangen. Zusammen mit der Kerneldebuggererweiterung !dma kann sie verwendet werden, um zu überprüfen, ob ein Treiber DMA ordnungsgemäß verwendet.

Diese Treiberüberprüfungsoption wird auch als HAL-Überprüfung bezeichnet. Einige fehlermeldungen, die von Driver Verifier erzeugt werden, können diesen Begriff verwenden.

Verschiedene Typen von DMA

DMA ist ein Mechanismus, mit dem ein Hardwaregerät Daten in oder aus dem Arbeitsspeicher übertragen kann, ohne den Prozessor zu verwenden. Der Prozessor muss die Übertragung einrichten, und das Gerät signalisiert den Prozessor, wenn es die Übertragung abgeschlossen hat. Der Vorteil dieses Systems besteht darin, dass der Prozessor andere Aufgaben ausführen kann, während die DMA-Übertragung ausgeführt wird.

Es gibt mehrere Typen von DMA, die in Windows 2000 und höher verwendet werden:

Common-Buffer-DMA
Common-Buffer-DMA wird ausgeführt, wenn das System einen einzelnen Puffer zuordnen kann, auf den sowohl die Hardware als auch die Software zugreifen kann. Der Treiber ist für die Synchronisierung der Zugriffe auf den Puffer verantwortlich. Der Arbeitsspeicher wird nicht zwischengespeichert, was diese Synchronisierung für den Treiber vereinfacht. Nach dem Einrichten eines gemeinsamen Puffers können sowohl der Treiber als auch die Hardware direkt in die Adressen im Puffer schreiben, ohne dass die HAL eingreift.

Paket-DMA
Paket-DMA wird ausgeführt, wenn ein einzelner vorhandener Puffer vorhanden ist, der für die Verwendung durch die Hardware zugeordnet werden muss. Ein Beispiel für die Verwendung von Paket-DMA ist die Übertragung einer Datei aus dem Arbeitsspeicher auf einen Datenträger. Die Verwendung von Common-Buffer-DMA wäre in dieser Situation verschwenderisch, da die Datei in den gemeinsamen Puffer übertragen werden müsste, bevor die Hardware sie auf den Datenträger übertragen könnte. Stattdessen wird die HAL konsultiert; Es gibt dem Treiber die Informationen, die er benötigt, um die Hardware beim Finden des tatsächlichen Puffers im Arbeitsspeicher zu unterstützen. Dieser Vorgang wird durch die Notwendigkeit erschwert, dass die beteiligten Routinen über verschiedene Architekturen hinweg funktionieren.

Punkt-/Erfassungs-DMA
Scatter/Gather DMA ist eine Tastenkombinationsmethode, mit der mehrere DMA-Paketübertragungen gleichzeitig eingerichtet werden. Wenn Sie beispielsweise ein Paket über das Netzwerk übertragen, fügt jeder Teil des Netzwerkstapels einen eigenen Header hinzu (TCP, IP, Ethernet usw.). Diese Header werden alle von verschiedenen Stellen im Arbeitsspeicher zugeordnet. In diesem Fall spart die Scatter/Gather-DMA Zeit, indem eine Batchanforderung an die HAL ausgegeben wird, um jeden Header und das Datensegment für den Zugriff durch die Hardware zu zuordnen. Anstatt die Paket-DMA-Routinen für jeden Teil des Pakets aufrufen zu müssen, ruft diese Methode jede Routine einmal auf und lässt die HAL für die Zuordnung jeder Einzelnen verantwortlich sein.

HinweisDie Scatter/Gather-Funktion bedeutet nicht, dass das Gerät die Scatter/Gather-Routinen verwenden kann. Die Scatter/Gather-Funktion bezieht sich auf ein Flag in der Gerätebeschreibung, das angibt, dass das Gerät aus einem beliebigen Bereich im Arbeitsspeicher lesen oder schreiben kann, anstatt nur einen bestimmten Bereich.

System-DMA
System-DMA wird ausgeführt, indem der System-DMA-Controller auf der Hauptplatine programmiert wird, um die Übertragung direkt durchzuführen. Nur ISA-Karten können System-DMA verwenden.

Auswirkungen der DMA-Überprüfung

Wenn die DMA-Überprüfung aktiv ist, erkennt Driver Verifier Missbrauch von DMA-Routinen, einschließlich:

  • Über- oder Unterlauf des DMA-Speicherpuffers (diese Fehler können durch die Hardware oder den Treiber verursacht werden).

  • Doppeltes Freigeben eines gemeinsamen Puffers, Adapterkanals, Kartenregisters oder Punkt-/Sammlungsliste.

  • Speicherverlust durch nicht freigegebene Puffer, Adapterkanäle, Kartenregister, Punkt-/Sammlungslisten oder Adapter.

  • Es gibt mehrere Adapterkanäle gleichzeitig für einen Adapter.

  • Der Versuch, einen Adapter zu verwenden, der bereits freigegeben wurde und nicht mehr vorhanden ist.

  • Einen Adapterpuffer wird nicht geleert.

  • Zu viele ausstehende Referenzanzahlen für einen Adapter.

  • Ausführen von DMA in einem auslagerungsfähigen Puffer (alle Puffer sollten gesperrt werden, bevor die DMA-Übertragung beginnt).

  • Ausführen von DMA für eine MDL mit mangled Flags.

  • Verweisen auf eine ungültige Systemadresse, entweder vor der ersten MDL oder nach dem Ende der ersten MDL, oder die Verwendung einer Übertragungslänge, die länger als der MDL-Puffer ist und eine Seitengrenze innerhalb der MDL überschreitet.

  • Zu viele Kartenregister gleichzeitig zuweisen oder mehr Kartenregister als die maximal zulässige Anzahl zuzuweisen.

  • Doppelte Zuordnung von Kartenregistern.

  • Versuchen, Kartenregister freizugeben, während einige noch zugeordnet sind.

  • Versuchen, ein Kartenregister zu leeren, das nicht zugeordnet wurde.

  • Versucht, zu viele Bytes am Ende der Zuordnungsregisterdatei zu löschen.

  • Das Aufrufen von DMA-Routinen an einem nicht ordnungsgemäßen IRQL.

  • Übergeben eines NULL-Wert-DMA_ADAPTER an eine HAL-Routine.

  • Übergeben einer Adresse und einer MDL an eine HAL-Routine, wenn die Adresse nicht in der MDL enthalten ist.

  • Versucht, einen Adressbereich zuzuordnen, der bereits zugeordnet wurde.

  • Versucht, einen Puffer zu leeren, der nicht zugeordnet ist.

  • Versuchen, einen Puffer der Länge null für die Übertragung zuzuordnen.

  • Aufrufen der veralteten Funktion HalGetAdapter (alle Treiber müssen stattdessen IoGetDmaAdapter verwenden).

Driver Verifier überwacht das Verhalten des Treibers und gibt Eine Fehlerüberprüfung 0xE6 aus, wenn eine dieser Verstöße auftritt. Eine Liste der Fehlerüberprüfungsparameter finden Sie unter Fehlerüberprüfung 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION).

Wann ist die DMA-Überprüfung nützlich?

Alle Treiber, die DMA direkt verwenden (durch Aufrufen der HAL DMA-Routinen), sollten mit der DMA-Überprüfung getestet werden.

Darüber hinaus sollten Auch Miniporttreiber getestet werden, da sie DMA häufig indirekt verwenden (durch Aufrufen von Porttreibern, die DMA verwenden).

Die DMA-Überprüfung kann auch eine effektive Möglichkeit sein, Speicherbeschädigungen zu erkennen, da sie erkennen kann, wenn entweder ein Treiber oder ein Hardwaregerät einen DMA-Puffer überschreibt.

Überwachen der DMA-Überprüfung

Die Kerneldebuggererweiterung !dma kann verwendet werden, um eine Fülle von DMA-Informationen anzuzeigen. Es kann verschiedene Details zum Verhalten der einzelnen DMA-Adapter anzeigen. Ein ausführliches Beispiel für die Erweiterung !dma sowie allgemeine Informationen zu Debuggererweiterungen finden Sie in der Dokumentation im Paket Debugtools für Windows. Weitere Informationen finden Sie unter Windows-Debuggen .

Aktivieren dieser Option

Sie können die DMA-Überprüfungsfunktion für einen oder mehrere Treiber aktivieren, indem Sie den Treiberüberprüfungs-Manager oder die Verifier.exe Befehlszeile verwenden. Ausführliche Informationen finden Sie unter Auswählen von Treiberüberprüfungsoptionen.

  • An der Befehlszeile

    An der Befehlszeile wird die DMA-Überprüfungsoption durch Bit 7 (0x80) dargestellt. Verwenden Sie zum Aktivieren der DMA-Überprüfung den Flagwert 0x80, oder fügen Sie dem Flagwert 0x80 hinzu. Beispiel:

    verifier /flags 0x80 /driver MyDriver.sys
    

    Das Feature ist nach dem nächsten Start aktiv.

    Unter Windows Vista und höheren Versionen von Windows können Sie auch die DMA-Überprüfung aktivieren und deaktivieren, ohne den Computer neu zu starten, indem Sie dem Befehl den Parameter /volatile hinzufügen. Beispiel:

    verifier /volatile /flags 0x80 /adddriver MyDriver.sys
    

    Diese Einstellung ist sofort wirksam, geht aber verloren, wenn Sie den Computer herunterfahren oder neu starten. Ausführliche Informationen finden Sie unter Verwenden flüchtiger Einstellungen.

    Die DMA-Überprüfungsfunktion ist auch in den Standardeinstellungen enthalten. Beispiel:

    verifier /standard /driver MyDriver.sys
    
  • Verwenden des Treiberüberprüfungs-Managers

    1. Starten Sie den Treiberüberprüfungs-Manager. Geben Sie Verifier in ein Eingabeaufforderungsfenster ein.
    2. Wählen Sie Benutzerdefinierte Einstellungen erstellen (für Codeentwickler) aus, und klicken Sie dann auf Weiter.
    3. Wählen Sie Einzelne Einstellungen aus einer vollständigen Liste auswählen aus.
    4. Wählen Sie DMA-Überprüfung (überprüfen) aus.

    Das DMA-Überprüfungsfeature ist auch in den Standardeinstellungen enthalten. Um dieses Feature zu verwenden, klicken Sie im Treiberüberprüfungs-Manager auf Standardeinstellungen erstellen.