Condividi tramite


Rilevamento speciale del danneggiamento della memoria del pool in Driver Verifier

Il danneggiamento della memoria è un problema comune del driver. Gli errori del driver possono causare malfunzionamenti molto tempo dopo che vengono commessi. Gli errori più comuni sono l'accesso alla memoria già liberata e l'allocazione di n byte e l'accesso 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 viene 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 per allineamenti

Sono disponibili due allineamenti del pool speciale:

  • L'allineamento Verifica Inizio è migliore per rilevare gli underrun di accesso.
  • L'allineamento Verifica fine è migliore per rilevare gli sforamenti di accesso.

Per ulteriori informazioni su come utilizzare le opzioni Verifica Inizio e Verifica Fine, consultare Rilevamento di sovraccarichi e sottocarichi. Si noti che la maggior parte dei danneggiamenti della memoria è dovuta ai trasbordi, non agli underrun.

Quando la funzionalità Pool speciale è attiva e verifica fine è stata selezionata, ogni allocazione di memoria richiesta dal driver viene inserita in una pagina separata. Viene restituito l'indirizzo più alto possibile che consente l'allocazione nella pagina, 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, Driver Verifier rileverà immediatamente questa situazione e genererà il controllo dei bug 0xCD. Se il driver scrive nella memoria prima dell'inizio del buffer, questo modificherà (presumibilmente) i modelli. Quando il buffer viene liberato, Driver Verifier rileverà la modifica ed eseguirà il controllo dei bug 0xC1.

Se il driver legge o scrive nel buffer dopo averlo liberato, Driver Verifier emetterà un Bug Check 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 causa un controllo del bug quando la memoria viene liberata. Questa opzione è diversamente identica all'opzione Verifica fine .

Verify End è l'allineamento predefinito, poiché gli errori di overrun sono molto più comuni nei driver rispetto agli errori di underrun.

Una singola allocazione di memoria può eseguire l'override di queste impostazioni e sceglierne 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 verrebbe 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 Pool speciale supporta la memoria allocata usando le API kernel seguenti:

Pool speciale in base al tag del pool o alle dimensioni di allocazione

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

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

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

Per richiedere un pool speciale per un tag o un intervallo di dimensioni del pool, usare Gflags, uno strumento incluso in Strumenti di debug per Windows. Per informazioni dettagliate, vedere Uso dell'utilità Global Flags.

È possibile usare la funzionalità Special Pool di Driver Verifier e le speciali funzionalità del pool di Gflags contemporaneamente. Nel caso in cui si tenti di allocare dal pool speciale, tenga presente che il pool speciale è limitato, che non tutti i tentativi di allocare dal pool speciale hanno esito positivo e che Windows indica un esito positivo per i tentativi non riusciti di allocare dal pool speciale che vengono 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 paginabile e due pagine di spazio di indirizzi virtuali. 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 richiedente non restituisce un errore, perché la richiesta del pool ha avuto esito positivo. Pertanto, non è consigliabile verificare più driver contemporaneamente se la funzionalità Pool speciale è attivata.

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

Le dimensioni del pool speciale aumentano con la quantità di memoria fisica nel sistema; idealmente questo deve essere almeno 1 Gigabyte (GB). Nelle macchine 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 paging per un fattore di due o tre.

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

Monitoraggio del pool speciale

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

Se il contatore Allocazioni del pool riuscite nel pool speciale è uguale al contatore Allocazioni del pool riuscite, allora 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 superiore, poiché il pool speciale non è applicabile.

Se la funzionalità Pool speciale è abilitata, ma meno di 95% di tutte le allocazioni di pool sono state assegnate dal pool speciale, verrà visualizzato un avviso in Driver Verifier Manager. 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 Debugging di Windows.

Attivazione dell'opzione speciale del pool

È 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 del Verificatore Driver.

Annotazioni

Per attivare la funzionalità Special Pool in base al tag del pool o alla dimensione di allocazione, o per impostare gli allineamenti Verifica inizio (rileva errori di sottoprenotazione) e Verifica fine (rileva errori di sovraprenotazione), utilizza l'utilità Global Flags; queste impostazioni di allineamento si applicano a tutte le allocazioni speciali del pool.

  • Alla riga di comando

    Nella riga di comando, l'opzione Pool speciale è rappresentata da Bit 0 (0x1).The command line, the Special Pool option is represented by Bit 0 (0x1). Per attivare il pool speciale, usare un valore flag di 0x1 o aggiungere 0x1 al valore del flag. Per esempio:

    verifier /flags 0x1 /driver MyDriver.sys
    

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

    È anche possibile attivare e disattivare il pool speciale senza riavviare il computer aggiungendo il parametro /volatile al comando. Per esempio:

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

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

    La funzionalità Pool speciale è inclusa anche nelle impostazioni standard. Per esempio:

    verifier /standard /driver MyDriver.sys
    
  • Uso del Driver Verifier Manager

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

    La funzionalità Pool speciale è inclusa anche nelle impostazioni standard. Per usare questa funzionalità, in Gestione Verificatore Driver, fare clic su Crea impostazioni standard.