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