Datenbeschädigung ohne besondere Behandlung der Übertragung

Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem Datenbeschädigungen auftreten können, ohne dass die Übertragung speziell behandelt wird.

Ursprüngliche Produktversion: Direkter Speicherzugriff
Ursprüngliche KB-Nummer: 2714876

Symptome

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

Ursache

PAE-fähige x86-Windows-Versionen, die den Zugriff auf Arbeitsspeicher über 4 GB unterstützen, implementieren eine spezielle Behandlung für Geräte, die berichten, dass sie nicht mehr als 32-Bit-DMA-Adressen verwenden können. Diese spezielle Behandlung wird in der Hardwareabstraktionsschicht (Hardware Abstraction Layer, HAL) des Betriebssystems mithilfe von Zuordnungsregistern implementiert, die manchmal als Bounce-Puffer bezeichnet werden.

Wenn ein Gerätetreiber einen DMA-Vorgang auf ein nur 32-Bit-fähiges Gerät startet, muss die Funktion HalGetScatterGatherList bestimmen, DmaOperations ob eine der physischen Adressen, die die Übertragung beschreiben, über 4 GB liegt. Die HAL ersetzt dann die physischen Adressen des Übertragungspuffers, die sich über 4 GB befinden, durch Map Register mit einer Größe von unter 4 GB, die das Gerät adressieren kann.

Wenn Ersetzungen durchgeführt wurden, besteht die generierte Scatter Gather List (SGL) aus physischen Adressen, von denen sich einige von der ursprünglichen MDL (Memory Descriptor List) unterscheiden, die die Übertragung beschreibt. Wenn der Treiber angibt, dass die DMA-Übertragung abgeschlossen ist, bestimmt die HAL, ob kartenregister verwendet wurden, um die Übertragung zu unterstützen. Wenn dies der Fall ist und der Vorgang ein Lesevorgang aus dem Gerät in den Systemspeicher war, kopiert die HAL den Inhalt eines map Registers, das verwendet wird, in den ursprünglichen Datenpuffer. Daten, die der Treiber vor abschluss der Anforderung direkt in die virtuellen Adressen des Übertragungspuffers geschrieben hat, werden daher nach Abschluss der Anforderung durch den Inhalt der durch HAL ersetzten Map Registers überschrieben.

Wenn die in den Kartenregistern 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 eine Mischung von 32-Bit-DMA-Lesevorgängen mit Schreibvorgängen in die virtuellen Adressen eines Übertragungspuffers erfordern, müssen die Funktion HalBuildMdlFromScatterGatherListverwendenDmaOperations.

Wenn Zuordnungsregister-Ersetzungen durch die HAL durchgeführt wurden, HalBuildMdlFromScatterGatherList erstellt eine neue MDL, die aus der physischen Adresse des nicht ersetzten Übertragungspuffers und den physischen Adressen der ersetzten HAL-Zuordnungsregister besteht. Die virtuelle Adresszuordnung der neuen MDL kann durch Aufrufen MmGetSystemAddressForMdlSafevon abgerufen werden. Wenn HalBuildMdlFromScatterGatherList die ursprüngliche MDL zurückgibt, wurden keine Zuordnungsregister-Ersetzungen durchgeführt.

Neue MDLs, die von HalBuildMdlFromScatterGatherList erstellt werden, müssen nicht zugeordnet und durch Aufrufe der MmUnmapLockedPagesIoFreeMdl-Funktion freigegeben werden.

Weitere Informationen