Rilevamento speciale del danneggiamento della memoria del pool in Verifica driver

Il danneggiamento della memoria è un problema comune del driver. Gli errori del driver possono causare arresti anomali a lungo dopo l'operazione di errore. Gli errori più comuni accedono alla memoria già liberata e allocano n byte e quindi accedono a n+1 byte.

Per rilevare il danneggiamento della memoria, Driver Verifier può allocare la memoria del driver da un pool speciale e monitorare tale pool per l'accesso non corretto. Il supporto speciale del pool è fornito per le routine fornite dal sistema in modalità kernel, ad esempio ExAllocatePoolWithTag e anche per le routine fornite dal sistema GDI, ad esempio EngAllocMem.

Pool speciale in base agli allineamenti

Sono disponibili due allineamenti del pool speciale:

  • L'allineamento Verifica avvio è migliore per rilevare le sottorune di accesso.
  • L'allineamento Verifica fine è migliore per rilevare l'overrun dell'accesso.

Per altre informazioni su come usare le opzioni Verifica inizio e verifica fine , vedere Rilevamento di overrun e sottorun. Si noti che la maggior parte dei danneggiamenti della memoria è dovuta a overruns, non sottorun.

Quando la funzionalità Pool speciale è attiva e verifica che la fine sia stata selezionata, ogni allocazione di memoria richiesta dal driver viene inserita in una pagina separata. L'indirizzo più alto possibile che consente di adattare l'allocazione nella pagina viene restituito, in modo che la memoria sia allineata alla fine della pagina. La parte precedente della pagina viene scritta con modelli speciali. La pagina precedente e la pagina successiva sono contrassegnate come inaccessibili.

Se il driver tenta di accedere alla memoria dopo la fine dell'allocazione, il verificatore driver rileverà immediatamente questa operazione e eseguirà il controllo bug 0xCD. Se il driver scrive nella memoria prima dell'inizio del buffer, questo modificherà (presumibilmente) i modelli. Quando il buffer viene liberato, il verificatore driver rileverà l'alterazione e il problema Verifica bug 0xC1.

Se il driver legge o scrive nel buffer dopo averla liberata, il verifica driver emetterà il controllo bug 0xCC.

Quando si seleziona Verifica avvio , il buffer di memoria è allineato all'inizio della pagina. Con questa impostazione, le sottorun causano un controllo immediato dei bug e l'overrun causano un controllo di bug quando la memoria viene liberata. Questa opzione è diversamente identica all'opzione Verifica fine .

Verificare che End sia l'allineamento predefinito, poiché gli errori di overrun sono molto più comuni nei driver rispetto agli errori di sottorun.

Un'allocazione di memoria singola può eseguire l'override di queste impostazioni e scegliere l'allineamento chiamando ExAllocatePoolWithTagPriority con il parametro Priority impostato su XxxSpecialPoolOverrun o XxxSpecialPoolUnderrun. Questa routine non può attivare o disattivare la funzionalità Pool speciale o richiedere il pool speciale per un'allocazione di memoria, che altrimenti verrà allocata dal pool normale. Solo l'allineamento può essere controllato da questa routine.

In Windows 7 e versioni successive del sistema operativo Windows, l'opzione Special Pool supporta la memoria allocata usando le API kernel seguenti:

Pool speciale per tag di pool o dimensioni di allocazione

Oltre alla funzionalità Special Pool di Driver Verifier, che richiede pool speciali per le allocazioni da un driver specificato, esistono due altri modi per usare il pool speciale:

  • Tag pool. Richiedere pool speciale per tutte le allocazioni con un tag di pool specificato.

  • Dimensioni Richiedere pool speciale per tutte le allocazioni all'interno di un intervallo di dimensioni specificato.

Per richiedere un pool speciale per un tag di pool o un intervallo di dimensioni, usare Gflags, uno strumento incluso negli strumenti di debug per Windows. Per informazioni dettagliate, vedere Uso dell'utilità flag globali.

È possibile usare la funzionalità Speciale Pool di Driver Verifier e le funzionalità speciali del pool di Gflags contemporaneamente. In caso contrario, tenere presente che il pool speciale è limitato, che non tutti i tentativi di allocare da un pool speciale hanno esito positivo e che Windows restituisce uno stato di esito positivo per i tentativi non riusciti di allocare da pool speciali soddisfatti dalle allocazioni dai pool di memoria regolari.

Efficienza speciale del pool

Non tutte le richieste di pool speciali vengono soddisfatte. Ogni allocazione del pool speciale usa una pagina di memoria fisica non impaginabile e due pagine dello spazio indirizzi virtuale. Se il pool è esaurito, la memoria viene allocata nel modo standard fino a quando il pool speciale non diventa nuovamente disponibile. Quando viene compilata una richiesta di pool speciale dal pool standard, la funzione di richiesta non restituisce un errore, poiché la richiesta del pool ha avuto esito positivo. Pertanto, non è consigliabile verificare più driver contemporaneamente se la funzionalità Pool speciale viene attivata.

Un singolo driver che effettua molte richieste di memoria di piccole dimensioni può anche esaurire questo pool. In questo caso, potrebbe essere preferibile assegnare tag di pool alle allocazioni di memoria del driver e dedicare il pool speciale a un tag di pool alla volta.

Le dimensioni del pool speciale aumentano con la quantità di memoria fisica nel sistema; idealmente questo deve essere almeno 1 Gigabyte (GB). Nei computer x86, poiché lo spazio virtuale (oltre a quello fisico) viene utilizzato, non usare l'opzione di avvio /3GB . È anche consigliabile aumentare la quantità minima/massima del file di pagina in base a un fattore di due o tre.

Per assicurarsi che tutte le allocazioni di un driver vengano testate, è consigliabile stressare il driver in lunghi periodi di tempo.

Monitoraggio del pool speciale

È possibile monitorare le statistiche relative alle allocazioni di pool. Questi elementi possono essere visualizzati da Gestione verifica driver, dalla riga di comando Verifier.exe o da un file di log. Per informazioni dettagliate, vedere Monitoraggio di contatori globali .

Se il contatore delle allocazioni del pool ha avuto esito positivo nel contatore Del pool speciale è uguale al contatore Allocazioni di pool riuscito , il pool speciale è stato sufficiente per coprire tutte le allocazioni di memoria. Se il contatore precedente è inferiore a quest'ultimo, il pool speciale è stato esaurito almeno una volta.

Questi contatori non tengono traccia delle allocazioni le cui dimensioni sono una pagina o più grandi, poiché il pool speciale non è applicabile a loro.

Se la funzionalità Pool speciale è abilitata, ma meno del 95% di tutte le allocazioni di pool sono state assegnate dal pool speciale, verrà visualizzato un avviso in Gestione verifica driver. In Windows 2000 questo avviso verrà visualizzato nella schermata Stato driver . In Windows XP e versioni successive, questo avviso verrà visualizzato nella schermata Contatori globali . In questo caso, è necessario verificare un elenco più breve di driver, verificare i singoli pool in base al tag del pool o aggiungere più memoria fisica al sistema.

L'estensione del debugger del kernel !verifier può essere usata anche per monitorare l'uso di pool speciali. Presenta informazioni simili a quella di Driver Verifier Manager. Per informazioni sulle estensioni del debugger, vedere Debug di Windows.

Attivazione dell'opzione di pool speciale

È possibile attivare la funzionalità Pool speciale 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.

Nota

Per attivare la funzionalità Del pool speciale per tag di pool o dimensioni di allocazione oppure impostare l'utilità Verifica inizio (rileva sottorun) e Verifica fine (rileva overruns), usare l'utilità Flag globali; queste impostazioni di allineamento si applicano a tutte le allocazioni di pool speciali.

  • Nella riga di comando

    Nella riga di comando l'opzione Pool speciale è rappresentata da Bit 0 (0x1). Per attivare Il pool speciale, usare un valore flag di 0x1 o aggiungere 0x1 al valore del flag. Ad esempio:

    verifier /flags 0x1 /driver MyDriver.sys
    

    La funzionalità sarà attiva dopo l'avvio successivo.

    Yyou può anche attivare e disattivare Il pool speciale senza riavviare il computer aggiungendo il parametro /volatile al comando. Ad esempio:

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

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

    La funzionalità Special Pool è inclusa anche nelle impostazioni standard. Ad esempio:

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

    1. Selezionare Crea impostazioni personalizzate (per sviluppatori di codice) e quindi fare clic su Avanti.
    2. Selezionare Seleziona singole impostazioni da un elenco completo.
    3. Selezionare (check) Pool speciale.

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