Datenbeschädigung ohne spezielle Verarbeitung der Übertragung

In diesem Artikel können Sie das Problem beheben, bei dem Datenbeschädigungen ohne spezielle Verarbeitung der Übertragung auftreten können.

Original Version des Produkts:   Direkter Speicherzugriff
Ursprüngliche KB-Nummer:   2714876

Problembeschreibung

Bei PAE-fähigen x86-Windows-Versionen, die den Zugriff auf Arbeitsspeicher oberhalb von 4 GB unterstützen, können Gerätetreiber, die DMA-Geräte (32-Bit Direct Memory Access) mit Schreibvorgängen an die virtuelle Adresse desselben Übertragungspuffers mischen, zu Datenbeschädigungen ohne spezielle Verarbeitung der Übertragung führen.

Ursache

PAE-fähige x86-Windows-Versionen, die den Zugriff auf Arbeitsspeicher oberhalb von 4 GB unterstützen, implementieren eine spezielle Behandlung für Geräte, die nicht in der Lage sind, mehr als 32-Bit-DMA-Adressen zu verwenden. Diese spezielle Behandlung wird in der Hardware Abstraktionsschicht (Hardware Abstraction Layer, HAL) des Betriebssystems mithilfe von Zuordnungs Registern implementiert, die manchmal als Bounce-Puffer bezeichnet werden.

Wenn ein Gerätetreiber einen DMA-Vorgang mit einem nur 32-Bit-fähigen Gerät beginnt, DmaOperations muss die Funktion HalGetScatterGatherList ermitteln, ob sich eine der physikalischen Adressen, die die Übertragung beschreiben, über 4 GB befinden. Die HAL ersetzt dann die physikalischen Adressen des Übertragungspuffers, die sich oberhalb von 4 GB befinden, mit einem Karten Register, das sich unter 4 GB befindet und mit dem das Gerät adressiert werden kann.

Wenn Substitutionen durchgeführt wurden, besteht die generierte Scatter Gather List (SGL) aus physikalischen Adressen, von denen sich einige von der ursprünglichen Speicher deskriptorliste (MDL) unterscheiden, die die Übertragung beschreibt. Wenn der Treiber angibt, dass die DMA-Übertragung abgeschlossen ist, bestimmt die HAL, ob Sie Kartenregister verwendet hat, um die Übertragung zu unterstützen. Wenn dies der Fall ist und der Vorgang vom Gerät in den Systemspeicher gelesen wurde, kopiert die HAL die Inhalte aller Karten Register, die für den ursprünglichen Datenpuffer verwendet werden. Daten, die vom Treiber vor der Anforderungs Vervollständigung direkt in die Übertragungspuffer-Adressen geschrieben wurden, werden auf diese Weise durch den Inhalt der HAL-Ersatz Zuordnungsregister nach Abschluss der Anforderung überschrieben.

Wenn die in den Zuordnungs Registern enthaltenen Daten nicht mit dem übereinstimmen, was der Treiber direkt in den Übertragungspuffer geschrieben hat, sind die Daten im Übertragungspuffer möglicherweise inkonsistent.

Lösung

Gerätetreiber, die intermixing 32-Bit-DMA-Lesevorgänge mit Schreibvorgängen in die virtuellen Adressen eines Übertragungspuffers benötigen, müssen DmaOperations Funktion verwenden HalBuildMdlFromScatterGatherList .

Wenn die Ersetzung von Zuordnungs Registern durch die HAL erfolgte, HalBuildMdlFromScatterGatherList wird eine neue MDL erstellt, die sich aus der nicht ersetzten physikalischen Adresse des Übertragungspuffers und den physikalischen Adressen der ersetzten HAL-Zuordnungsregister zusammensetzt. Die virtuelle Adresszuordnung der neuen MDL kann durch Aufrufen abgerufen werden MmGetSystemAddressForMdlSafe . Wenn HalBuildMdlFromScatterGatherList die ursprüngliche MDL zurückgegeben wird, wurden keine Karten Register Substitutionen durchgeführt.

Neue MDLs erstellt von HalBuildMdlFromScatterGatherList müssen nicht zugeordnet und durch Aufrufe an MmUnmapLockedPages und IoFreeMdl-Funktionfreigegeben werden.

Weitere Informationen