Condividi tramite


Uso dello stack di kernel

Le dimensioni dello stack in modalità kernel sono limitate a circa tre pagine. Pertanto, quando si passano dati alle routine interne, i driver non possono passare grandi quantità di dati nello stack del kernel.

Per evitare l'esaurimento dello spazio dello stack in modalità kernel, usare le linee guida di progettazione seguenti:

  • Evitare di effettuare chiamate annidate profondamente da una routine del driver interna a un'altra, se ogni routine passa i dati nello stack del kernel.

  • Assicurarsi di limitare il numero di chiamate ricorsive che possono verificarsi, se si progetta un driver con una routine ricorsiva.

In altre parole, la struttura dell'albero delle chiamate di un driver deve essere relativamente piatta. È possibile chiamare le routine IoGetStackLimits e IoGetRemainingStackSize per determinare lo spazio dello stack di kernel disponibile o KeExpandKernelStackAndCallout per espanderlo. Si noti che le dimensioni dello stack in modalità kernel possono variare tra piattaforme hardware diverse e versioni diverse del sistema operativo.

L'esecuzione dello spazio dello stack del kernel causa un errore di sistema irreversibile. Pertanto, è preferibile che un driver alloca la memoria dello spazio di sistema che non venga esaurito dello spazio dello stack del kernel. Tuttavia, il pool non a pagina è anche una risorsa di sistema limitata.

In genere, lo stack in modalità kernel si trova in memoria, tuttavia può essere a volte impaginato se il thread entra in uno stato di attesa che specifica la modalità utente. Per informazioni su come disabilitare temporaneamente il paging dello stack di kernel per il thread corrente, vedere KeSetKernelStackSwapEnable . Per motivi di prestazioni, non è consigliabile disabilitare il paging dello stack di kernel a livello globale, ma se si vuole eseguire questa operazione durante una sessione di debug, vedere Disabilitare il paging di stack di kernel

Poiché lo stack di kernel potrebbe essere impaginato, prestare attenzione al passaggio di buffer basati su stack (ad esempio variabili locali) a DMA o a qualsiasi routine eseguita in DISPATCH_LEVEL o versioni successive.