Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo consente di risolvere il problema in cui può verificarsi il danneggiamento dei dati senza una gestione speciale del trasferimento.
Versione originale del prodotto: Accesso diretto alla memoria
Numero KB originale: 2714876
Sintomi
Nelle versioni di Windows x86 abilitate per PAE che supportano l'accesso alla memoria superiore a 4 GB, i driver di dispositivo che mescolano le letture del dispositivo DMA (Direct Memory Access) a 32 bit con scritture nell'indirizzo virtuale dello stesso buffer di trasferimento possono causare un danneggiamento dei dati senza una gestione speciale del trasferimento.
Causa
Le versioni di Windows x86 abilitate per PAE che supportano l'accesso alla memoria superiore a 4 GB implementano una gestione speciale per i dispositivi che segnalano l'incapacità di usare più di indirizzi DMA a 32 bit. Questa gestione speciale viene implementata nel livello di astrazione hardware (HAL) del sistema operativo usando registri mappa a volte definiti buffer di rimbalzo.
Quando un driver di dispositivo avvia un'operazione DMA su un dispositivo con supporto solo a 32 bit, DmaOperations la funzione HalGetScatterGatherList deve determinare se uno degli indirizzi fisici che descrivono il trasferimento risiede oltre 4 GB. Hal sostituirà quindi gli indirizzi fisici del buffer di trasferimento che risiedono al di sopra di 4 GB con registro mappa che risiede al di sotto di 4 GB, che il dispositivo è in grado di indirizzare.
Se sono state eseguite sostituzioni, l'elenco SGL (Scatter Gather List) generato sarà composto da indirizzi fisici, alcuni dei quali differiscono dall'elenco dei descrittori di memoria originale (MDL) che descrive il trasferimento. Quando il driver indica che il trasferimento DMA è stato completato, l'HAL determina se è stata utilizzata la registrazione della mappa per supportare il trasferimento. In caso affermativo, e se l'operazione è stata letta dal dispositivo alla memoria di sistema, hal copia il contenuto di qualsiasi registro mappa usato nel buffer di dati originale. I dati scritti direttamente negli indirizzi virtuali del buffer di trasferimento dal driver prima del completamento delle richieste verranno quindi sovrascritti dal contenuto dei registri mappa sostituiti hal al completamento della richiesta.
Se i dati contenuti nei registri mappa non corrispondono a ciò che il driver ha scritto direttamente nel buffer di trasferimento, i dati nel buffer di trasferimento potrebbero non essere coerenti.
Risoluzione
I driver di dispositivo che richiedono la combinazione di operazioni di lettura DMA a 32 bit con scritture negli indirizzi virtuali di un buffer di trasferimento devono usare DmaOperations la funzione HalBuildMdlFromScatterGatherList.
Se le sostituzioni map register sono state eseguite da HAL, HalBuildMdlFromScatterGatherList creerà un nuovo MDL composto dall'indirizzo fisico del buffer di trasferimento non sostituito e dagli indirizzi fisici dei registri mappa HAL sostituiti. Il mapping degli indirizzi virtuali del nuovo file MDL può essere ottenuto chiamando MmGetSystemAddressForMdlSafe. Se HalBuildMdlFromScatterGatherList restituisce il file MDL originale, non sono state eseguite sostituzioni del registro mappa.
I nuovi MDL creati da HalBuildMdlFromScatterGatherList devono essere decompressi e liberati dalle chiamate alla MmUnmapLockedPages funzione E IoFreeMdl.