核心模式堆疊的大小限制在大約三個頁面。 因此,將數據傳遞至內部例程時,驅動程式無法在核心堆疊上傳遞大量數據。
若要避免耗盡內核模式堆棧空間,請使用下列設計指導方針:
如果每個例程在核心堆疊上傳遞數據,請避免從一個內部驅動程式例程對另一個內部驅動程式例程進行深層巢狀呼叫。
如果您設計具有遞歸例程的驅動程式,請務必限制可能發生的遞歸呼叫數目。
換句話說,驅動程式的呼叫樹狀結構應該相對平坦。 您可以呼叫 IoGetStackLimits 和 IoGetRemainingStackSize 例程,以判斷可用的核心堆棧空間,或 KeExpandKernelStackAndCallout 加以擴充。 請注意,內核模式堆疊的大小可能會因不同硬體平臺和不同版本的作系統而有所不同。
核心堆疊空間用盡會導致嚴重系統錯誤。 因此,驅動程式最好 配置系統空間記憶體,而不是耗盡核心堆疊空間。 不過,非分頁集區也是有限的系統資源。
一般而言,核心模式堆疊位於記憶體中,不過,當線程進入指定為使用者模式的等候狀態時,偶爾會分頁。 如需如何暫時停用目前線程核心堆疊分頁的資訊,請參閱 KeSetKernelStackSwapEnable。 基於效能考慮,不建議全域停用核心堆疊分頁,但如果您想要在偵錯會話期間這麼做,請參閱 停用核心堆疊的分頁
因為核心堆疊可能會分頁出,因此請謹慎將堆疊型緩衝區(亦即局部變數)傳遞至 DMA 或任何在 DISPATCH_LEVEL 或更新版本執行的例程。