Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
La verifica DMA monitora l'uso di DMA (Direct Memory Access). Poiché le routine DMA sono cambiate man mano che Windows ha sviluppato, molti driver usano in modo errato le chiamate DMA. Inoltre, alcuni sviluppatori di driver tentano di ignorare completamente il sottosistema HAL DMA. Questa pratica può introdurre bug insidiosi nel driver.
L'opzione verifica DMA di Driver Verifier tenta di rilevare errori DMA comuni. Insieme all'estensione del debugger del kernel !dma , può essere usata per verificare che un driver usi DMA in modo appropriato.
Questa opzione Driver Verifier è detta anche verifica HAL. Alcuni messaggi di errore generati da Driver Verifier possono usare questo termine.
Tipi diversi di DMA
DMA è un meccanismo attraverso il quale un dispositivo hardware può trasferire i dati da o verso la memoria senza usare il processore. Il processore è necessario per configurare il trasferimento e il dispositivo segnalerà il processore al termine del trasferimento. Il vantaggio di questo sistema è che il processore può eseguire altre attività mentre viene eseguito il trasferimento DMA.
Esistono diversi tipi di DMA usati in Windows 2000 e versioni successive:
Common-buffer DMA
Il DMA del buffer comune viene eseguito quando il sistema può allocare un singolo buffer accessibile sia dall'hardware che dal software. Il driver è responsabile della sincronizzazione degli accessi al buffer. La memoria non viene memorizzata nella cache, semplificando questa sincronizzazione per il driver. Dopo aver configurato un buffer comune, sia il driver che l'hardware possono scrivere direttamente negli indirizzi nel buffer senza alcun intervento dell'HAL.
DMA pacchetti
Il DMA del pacchetto viene eseguito quando è presente un singolo buffer esistente che deve essere mappato per essere utilizzato dall'hardware. Un esempio di utilizzo di DMA di pacchetti è il trasferimento di un file dalla memoria a un disco. L'uso di DMA con buffer comune in questa situazione sarebbe sprecato, perché il file deve essere trasferito al buffer comune prima che l'hardware possa trasferirlo sul disco. Al contrario, l'HAL viene consultato; fornisce al driver le informazioni necessarie per aiutare l'hardware a trovare il buffer effettivo in memoria. Questa operazione è complicata dalla necessità delle routine coinvolte nel lavorare in diverse architetture.
DMA a dispersione/raccolta
Scatter/gather DMA è un metodo semplificato che imposta diversi trasferimenti DMA di pacchetti contemporaneamente. Se si trasferisce un pacchetto in rete, ad esempio, ogni parte dello stack di rete aggiunge la propria intestazione (TCP, IP, Ethernet e così via). Queste intestazioni vengono allocate da posizioni diverse in memoria. In questo caso, la DMA a dispersione/raccolta consente di risparmiare tempo inviando una richiesta batch all'HAL per eseguire il mapping di ogni intestazione più il segmento di dati per l'accesso dall'hardware. Invece di dover chiamare le routine DMA del pacchetto in ogni parte del pacchetto, questo metodo chiama ogni routine una sola volta e consente all'HAL di eseguire il mapping singolarmente.
Nota Lafunzionalità di dispersione/raccolta non significa che il dispositivo può usare le routine a dispersione/raccolta. La funzionalità di dispersione/raccolta fa riferimento a un flag nella descrizione del dispositivo che indica che il dispositivo è in grado di leggere o scrivere da qualsiasi area in memoria, invece di un determinato intervallo.
DMA di sistema
DMA di sistema viene eseguito programmando il controller DMA di sistema sulla scheda madre per eseguire direttamente il trasferimento. Solo le schede ISA possono usare DMA di sistema.
Effetti della verifica DMA
Quando la verifica DMA è attiva, Driver Verifier rileva usi impropri delle routine DMA, tra cui:
Sovraccarico o sottocarico del buffer di memoria DMA (questi errori possono essere eseguiti dall'hardware o dal driver).
Doppio rilascio di un buffer comune, un canale dell'adattatore, un registro di mappa o un elenco a dispersione/raccolta.
Perdite di memoria dovute al mancato rilascio di buffer comuni, canali di adattatori, registri di mappatura, liste scatter/gather o adattatori.
Avere più di un canale adattatore presente per un adattatore contemporaneamente.
Tentativo di utilizzare un adattatore che è già stato liberato e non esiste più.
Non svuotamento del buffer dell'adattatore.
Troppi riferimenti pendenti per un adattatore.
Esecuzione del DMA in un buffer paginabile (tutti i buffer devono essere bloccati prima dell'inizio del trasferimento DMA).
Esecuzione di DMA su un MDL con flag alterati.
Riferimento a un indirizzo di sistema non valido, prima del primo MDL o dopo la fine del primo MDL o usando una lunghezza di trasferimento maggiore del buffer MDL e supera un limite di pagina all'interno del file MDL.
Allocazione di troppi registri mappa contemporaneamente o allocazione di più registri mappa rispetto al numero massimo consentito.
Mappatura doppia dei registri di mappa.
Tentativo di liberare registri di mappa mentre alcuni sono ancora mappati.
Tentativo di cancellare un registro mappa che non è stato mappato.
Tentativo di scaricare troppi byte alla fine del file di registro della mappa.
Chiamata delle routine DMA in un IRQL non corretto.
Il passaggio di un valore Null DMA_ADAPTER a una routine HAL.
Passaggio di un indirizzo e di un MDL a una routine HAL quando l'indirizzo non è contenuto nel file MDL.
Tentativo di eseguire il mapping di un intervallo di indirizzi già mappato.
Tentativo di svuotare un buffer non mappato.
Tentativo di eseguire la mappatura di un buffer di lunghezza zero per il trasferimento.
Chiamata della funzione obsoleta HalGetAdapter (invece, tutti i driver devono usare IoGetDmaAdapter).
Driver Verifier monitora il comportamento del driver e rilascia il controllo dei bug 0xE6 se si verifica una di queste violazioni. Per un elenco dei parametri di controllo dei bug, vedere Verifica bug 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION).
Quando è utile la verifica DMA?
Tutti i driver che usano direttamente DMA (chiamando le routine HAL DMA) devono essere testati con la verifica DMA.
Inoltre, è necessario testare anche i driver miniport, poiché spesso usano DMA indirettamente (chiamando driver di porta che usano DMA).
La verifica DMA può anche essere un modo efficace per rilevare il danneggiamento della memoria, perché può individuare quando un driver o un dispositivo hardware esegue il sovraccarico di un buffer DMA.
Monitoraggio della verifica DMA
L'estensione del debugger del kernel !dma può essere usata per visualizzare un'ampia gamma di informazioni DMA. Può visualizzare vari dettagli sul comportamento di ogni adattatore DMA. È disponibile un esempio dettagliato dell'estensione !dma , nonché informazioni generali sulle estensioni del debugger, nella documentazione del pacchetto Strumenti di debug per Windows. Per informazioni dettagliate, vedere Debug di Windows .
l'attivazione di questa opzione
È possibile attivare la funzionalità di verifica DMA per uno o più driver usando Gestione verifica driver o la riga di comando Verifier.exe. Per informazioni dettagliate, vedere Selezione delle Opzioni del Verificatore Driver.
Alla riga di comando
Nella riga di comando l'opzione Verifica DMA è rappresentata da Bit 7 (0x80). Per attivare la verifica DMA, usare un valore flag di 0x80 o aggiungere 0x80 al valore del flag. Per esempio:
verifier /flags 0x80 /driver MyDriver.sysLa funzionalità sarà attiva dopo l'avvio successivo.
In Windows Vista e versioni successive di Windows è anche possibile attivare e disattivare la verifica DMA senza riavviare il computer aggiungendo il parametro /volatile al comando. Per esempio:
verifier /volatile /flags 0x80 /adddriver MyDriver.sysQuesta impostazione è effettiva immediatamente, ma viene persa quando si arresta o si riavvia il computer. Per informazioni dettagliate, vedere Uso di impostazioni volatili.
La funzionalità di verifica DMA è inclusa anche nelle impostazioni standard. Per esempio:
verifier /standard /driver MyDriver.sysUso del Driver Verifier Manager
- Avviare il Manager verifica driver. Digitare Verifier in una finestra del Prompt dei Comandi.
- Selezionare Crea impostazioni personalizzate (per sviluppatori di codice) e quindi fare clic su Avanti.
- Selezionare Selezionare le singole impostazioni da un elenco completo.
- Selezionare la casella di Verifica DMA.
La funzionalità di verifica DMA è inclusa anche nelle impostazioni standard. Per usare questa funzionalità, in Gestione Verificatore Driver, fare clic su Crea impostazioni standard.