Använda kernelstacken

Storleken på kernellägesstacken är begränsad till cirka tre sidor. När data skickas till interna rutiner kan därför drivrutiner inte skicka stora mängder data på kernelstacken.

Använd följande designriktlinjer för att undvika att stackutrymmet i kernelläge börjar ta slut:

  • Undvik att göra djupt kapslade anrop från en intern drivrutin till en annan, om varje rutin skickar data i kernelstacken.

  • Se till att du begränsar antalet rekursiva anrop som kan inträffa om du utformar en drivrutin som har en rekursiv rutin.

Med andra ord bör en förares anropsträdsstruktur vara relativt platt. Du kan anropa rutinerna IoGetStackLimits och IoGetRemainingStackSize för att fastställa det tillgängliga kernelstackutrymmet eller KeExpandKernelStackAndCallout för att expandera det. Observera att storleken på kernellägesstacken kan variera mellan olika maskinvaruplattformar och olika versioner av operativsystemet.

Brist på kernelstackutrymme orsakar ett allvarligt systemfel. Därför är det bättre för en drivrutin att allokera systemutrymmesminne än att få slut på kernelstackutrymme. Men icke-sidsidig pool är också en begränsad systemresurs.

Vanligtvis finns stacken i kernelläge i minnet, men den kan ibland bläddras ut om tråden anger ett väntetillstånd som anger användarläge. Se KeSetKernelStackSwapEnable för information om hur du tillfälligt inaktiverar växling av kärnstack för den aktuella tråden. För prestandaskäl rekommenderas det inte att inaktivera växling av kärnstaplar globalt, men om du vill göra det under en felsökningssession, se Inaktivera växling av kärnstaplar

Eftersom kernelstacken kan sidas ut bör du vara försiktig med att skicka stackbaserade buffertar (dvs. lokala variabler) till DMA eller någon rutin som körs vid DISPATCH_LEVEL eller högre.