Share via


Verifica DMA

La verifica DMA monitora l'uso di DMA (Direct Memory Access). Poiché le routine DMA sono cambiate man mano che Windows è stato sviluppato, molti driver usano chiamate DMA non corrette. Inoltre, alcuni writer di driver tentano di ignorare completamente il sottosistema HAL DMA. Questa procedura può introdurre bug insidiosi nel driver.

L'opzione DMA Verification 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 tramite il quale un dispositivo hardware può trasferire 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:

DMA common buffer
La DMA del buffer comune viene eseguita 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 da parte dell'HAL.

DMA dei pacchetti
Il DMA del pacchetto viene eseguito quando è presente un singolo buffer esistente di cui è necessario eseguire il mapping per l'uso da parte dell'hardware. Un esempio di utilizzo del pacchetto DMA è il trasferimento di un file dalla memoria a un disco. L'uso di DMA del 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à che le routine coinvolte funzionino in architetture diverse.

DMA a dispersione/raccolta
DMA a dispersione/raccolta è un metodo di collegamento che configura 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 tutte allocate da posizioni diverse in memoria. In questo caso, la DMA a dispersione/raccolta consente di risparmiare tempo inviando una richiesta batch a 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 Funzionalitàdi dispersione/raccolta non significa che il dispositivo può usare le routine di 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, anziché solo 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:

  • Overrunning o underrunning the DMA memory buffer (questi errori possono essere eseguiti dall'hardware o dal driver).

  • Liberando due volte un buffer comune, un canale di adattatori, un registro mappa o un elenco a dispersione/raccolta.

  • Perdita di memoria non liberando buffer comuni, canali di adapter, registri mappa, elenchi a dispersione/raccolta o adattatori.

  • Avere più di un canale di adattatore presente per una scheda contemporaneamente.

  • Tentativo di utilizzare un adattatore che è già stato liberato e non esiste più.

  • Non scaricamento di un buffer dell'adattatore.

  • Numero eccessivo di conteggi dei riferimenti in sospeso per un adattatore.

  • Esecuzione di DMA in un buffer di paging (tutti i buffer devono essere bloccati prima dell'inizio del trasferimento DMA).

  • Esecuzione di DMA su un file MDL con flag mangled.

  • Fare riferimento a un indirizzo di sistema non valido, prima del primo MDL o dopo la fine del primo MDL oppure usando una lunghezza di trasferimento più lunga 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.

  • Doppio mapping dei registri mappa.

  • Tentativo di liberare registri mappa mentre alcuni sono ancora mappati.

  • Tentativo di scaricare un registro mappa di cui non è stato eseguito il mapping.

  • Tentativo di scaricare troppi byte alla fine del file di registro della mappa.

  • Chiamata di routine DMA a un IRQL non corretto.

  • 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 scaricare un buffer non mappato.

  • Tentativo di eseguire il mapping di un buffer di lunghezza zero per il trasferimento.

  • Chiamando la funzione obsoleta HalGetAdapter (tutti i driver devono usare invece IoGetDmaAdapter ).

Driver Verifier monitora il comportamento del driver e rilascia il controllo dei bug 0xE6 se si verifica una di queste violazioni. Vedere Controllo bug 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) per un elenco dei parametri di controllo dei bug.

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, i driver miniport devono essere testati, 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ò rilevare 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 .

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 di verifica driver.

  • Nella riga di comando

    Nella riga di comando l'opzione Verifica DMA è rappresentata da Bit 7 (0x80). Per attivare la verifica DMA, usare il valore del flag 0x80 o aggiungere 0x80 al valore del flag. Ad esempio:

    verifier /flags 0x80 /driver MyDriver.sys
    

    La 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 . Ad esempio:

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

    Questa impostazione è effettiva immediatamente, ma viene persa quando si arresta o si riavvia il computer. Per informazioni dettagliate, vedere Uso delle impostazioni volatili.

    La funzionalità di verifica DMA è inclusa anche nelle impostazioni standard. Ad esempio:

    verifier /standard /driver MyDriver.sys
    
  • Uso di Gestione verifica driver

    1. Avviare Gestione verifica driver. Digitare Verifier in una finestra del prompt dei comandi.
    2. Selezionare Crea impostazioni personalizzate (per sviluppatori di codice) e quindi fare clic su Avanti.
    3. Selezionare Seleziona singole impostazioni da un elenco completo.
    4. Selezionare (controllo) Verifica DMA.

    La funzionalità di verifica DMA è inclusa anche nelle impostazioni standard. Per usare questa funzionalità, in Gestione verifica driver fare clic su Crea impostazioni standard.