Controllo bug 0xD1: DRIVER_IRQL_NOT_LESS_OR_EQUAL

Il controllo dei bug DRIVER_IRQL_NOT_LESS_OR_EQUAL ha un valore di 0x000000D1. Ciò indica che un driver in modalità kernel ha tentato di accedere alla memoria visualizzabile durante il processo IRQL troppo elevato.

Importante

Questo articolo è destinato ai programmatori. Se si è un cliente che ha ricevuto un codice di errore della schermata blu durante l'uso del computer, vedere Risolvere gli errori della schermata blu.

parametri DRIVER_IRQL_NOT_LESS_OR_EQUAL

Parametro Descrizione

1

Memoria a cui si fa riferimento.

2

IRQL al momento del riferimento.

3

  • 0 - Lettura
  • 1 - Scrittura
  • 2 - Esecuzione
  • 8 - Esecuzione

4

Indirizzo a cui si fa riferimento alla memoria. Usare ln (elencare i simboli più vicini) in questo indirizzo per visualizzare il nome della funzione.

Causa

Per determinare la causa, è necessario che il debugger di Windows, l'esperienza di programmazione e l'accesso al codice sorgente per il modulo di errore.

In genere, quando si verifica questo errore, un driver ha tentato di accedere a un indirizzo visualizzabile (o completamente non valido) mentre il livello di richiesta di interrupt (IRQL) era troppo elevato. Questo errore può essere causato da:

  • Dereferenziazione di un puntatore non valido (ad esempio un puntatore NULL o liberato) durante l'esecuzione al livello DISPATCH_LEVEL o superiore.

  • Accesso ai dati paginabili al livello DISPATCH_LEVEL o superiore.

  • Esecuzione di codice paginabile al livello DISPATCH_LEVEL o superiore.

Se è possibile identificare un driver responsabile dell'errore, il nome viene stampato sullo schermo blu e memorizzato in memoria nella posizione (PUNICODE_STRING) KiBugCheckDriver. È possibile usare dx (espressione del modello a oggetti del debugger di visualizzazione) per visualizzare questo comando: dx KiBugCheckDriver.

Questo controllo dei bug è in genere causato da driver che hanno usato indirizzi di memoria non corretti.

Le possibili cause dell'errore di pagina includono gli eventi seguenti:

  • La funzione è stata contrassegnata come pageable ed era in esecuzione in un IRQL con privilegi elevati ,che include l'acquisizione di un blocco.

  • La chiamata di funzione è stata effettuata a una funzione in un altro driver e tale driver è stato scaricato.

  • La funzione è stata chiamata usando un puntatore a funzione che era un puntatore non valido.

Per altre informazioni sui IRQLs di Windows, vedi Windows Internals 7th Edition Part 1 di Axis Yosifovich, Mark E. Russinovich, David A. Solomon e Alex Ionovich.

Risoluzione

Se il problema è causato dal driver in fase di sviluppo, assicurarsi che la funzione in esecuzione al momento del controllo dei bug sia:

  • Non contrassegnato come pageable
  • Non chiama altre funzioni inline che potrebbero essere eseguiti il paging.

L'estensione del debugger !analyze visualizza informazioni sul controllo dei bug e può essere utile per determinare la causa radice. L'esempio seguente è l'output di !analyze.

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: fffff808add27150, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff808adc386a6, address which referenced memory

Se è possibile identificare un driver responsabile dell'errore, il nome viene stampato sullo schermo blu e memorizzato in memoria nella posizione (PUNICODE_STRING) KiBugCheckDriver. È possibile usare dx (espressione del modello a oggetti del debugger di visualizzazione) per visualizzare questo comando: dx KiBugCheckDriver.

0: kd> dx KiBugCheckDriver
KiBugCheckDriver                 : 0xffffc6092de892c8 : "Wdf01000.sys" [Type: _UNICODE_STRING *]

Se nel file dump è disponibile un frame trap, usare il comando trap per impostare il contesto sull'indirizzo specificato.

Per avviare il debug di questo tipo di controllo dei bug, esaminare l'analisi dello stack usando i comandi k, kb, kc, kd, kp, kP, kv (display stack backtrace).

Nel debugger eseguire il comando !irql per visualizzare informazioni sull'IRQL di un processore nel computer di destinazione prima dell'interruzione del debugger. Ad esempio:

0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

Nella maggior parte dei casi di questo tipo di controllo dei bug, il problema non è il livello IRQL, ma piuttosto la memoria a cui si accede.

Poiché questo controllo dei bug è in genere causato da driver che hanno usato indirizzi di memoria non corretti, usare i parametri 1, 3 e 4 per analizzare ulteriormente.

Usare ln (elencare i simboli più vicini) con il parametro 4 per visualizzare il nome della funzione chiamata. Esaminare anche l'output !analyze per verificare se viene identificato il codice di errore.

Usare !pool nell'indirizzo del parametro 1 per verificare se è un pool di paging. Usare !address e il comando !pte avanzato per altre informazioni su questa area di memoria.

Usare i comandi di memoria di visualizzazione per esaminare la memoria a cui si fa riferimento nel comando nel parametro 1.

Usare i comandi u, ub, uu (unassemble) per esaminare il codice nell'indirizzo che ha fatto riferimento alla memoria nel parametro 4.

Usare il comando lm t n per elencare i moduli caricati nella memoria. Usare !memusage ed esaminare lo stato generale della memoria di sistema.

Driver Verifier

Driver Verifier è uno strumento in esecuzione in tempo reale per esaminare il comportamento dei driver. Ad esempio, Driver Verifier controlla l'uso di risorse di memoria, ad esempio pool di memoria. Se identifica gli errori nell'esecuzione del codice del driver, crea in modo proattivo un'eccezione per consentire l'ulteriore analisi di tale parte del codice driver. Driver Verifier Manager è integrato in Windows ed è disponibile in tutti i PC Windows.

Per avviare Gestione verifica driver, digitare verifica al prompt dei comandi. È possibile configurare i driver da verificare. Il codice che verifica i driver comporta un sovraccarico durante l'esecuzione, quindi provare a verificare il minor numero di driver possibili. Per altre informazioni, vedere Driver Verifier.

Osservazioni:

Se non si è dotati di usare il debugger Windows per lavorare su questo problema, è possibile usare alcune tecniche di risoluzione dei problemi di base.

  • Controllare l'accesso di sistema Visualizzatore eventi per ulteriori messaggi di errore che potrebbero aiutare a identificare il dispositivo o il driver che causa questo controllo del bug.

  • Se un driver viene identificato nel messaggio di controllo dei bug, disabilitare il driver o rivolgersi al produttore per verificare la presenza di aggiornamenti dei driver.

  • Verificare che qualsiasi nuovo hardware installato sia compatibile con la versione installata di Windows. Ad esempio, puoi ottenere informazioni sull'hardware necessario in Specifiche di Windows 10.

Per altre informazioni generali sulla risoluzione dei problemi, vedere Analizzare i dati della schermata blu di controllo dei bug.