核心模式堆疊是乙個有限的儲存區域,經常用於儲存從乙個函式傳遞到另乙個函式的資訊以及用於區域性變數儲存。雖然堆疊被對映到系統空間,但是它被視為原始呼叫例程的執行緒上下文的一部分,而不是驅動程式本身的一部分。這意味著只要呼叫執行緒正在執行,就可以保證存在堆疊,但是它可以隨執行緒一起清除。在任何核心模式執行緒上執行的**(不管它是系統執行緒還是驅動程式建立的執行緒)都使用該執行緒的核心模式堆疊(除非**是 dpc,這種情況下它在某些平台上使用處理器的 dpc 堆疊)。
核心模式堆疊的大小在不同的硬體平台上有所不同。例如:
•在基於 x86 的平台上,核心模式堆疊是 12k。
•在基於 x64 的平台上,核心模式堆疊是 24k。
堆疊空間耗盡將導致作業系統崩潰和乙個或幾個可能的錯誤檢查。可能包括下列錯誤檢查:
0x1e:kmode_exception_not_handled,
0x7e:system_thread_exception_not_handled 或
0x8e:kernel_mode_exception_not_handled 和乙個異常碼 status_access_violation,後者指示記憶體訪問違法。
0x2b:panic_stack_switch,通常在核心模式驅動程式使用過多堆疊空間時發生。
kf(顯示堆疊跟蹤)
使用iogetstacklimits和iogetremainingstacksize例程來確定是否存在足夠的堆疊空間來呼叫函式去執行任務,如果沒有,將任務排隊到乙個工作項中。
prefast 是 windows ddk 提供的帶有驅動程式特定規則的靜態源**分析工具,可用來查詢正在使用過量核心模式堆疊的函式。
Linux 核心堆疊
所有程序 包括核心程序和普通程序 都有乙個核心棧,在x86的32位機器上核心棧大小可以為4kb或8kb,這個可以在編譯核心的時候配置。核心棧的用 途有兩個 1 當程序陷入核心態,即核心代表程序執行系統呼叫時,系統呼叫的引數就放在核心棧上,核心棧記錄著程序的在核心中的呼叫鏈 2 在核心棧被配 置成8k...
Linux 核心堆疊
所有程序 包括核心程序和普通程序 都有乙個核心棧,在x86的32位機器上核心棧大小可以為4kb或8kb,這個可以在編譯核心的時候配置。核心棧的用途有兩個 1 當程序陷入核心態,即核心代表程序執行系統呼叫時,系統呼叫的引數就放在核心棧上,核心棧記錄著程序的在核心中的呼叫鏈 2 在核心棧被配置成8kb大...
磁碟的裝置驅動堆疊
磁碟的裝置驅動堆疊 本文節選自 windows 核心情景分析 採用開源 reactos 一書 讀者已經在前幾節中看到,裝置的驅動常常分成 類裝置驅動 和 埠裝置驅動 兩層。例如滑鼠器就成為乙個裝置的類,而具體又有ps 2滑鼠器 串列埠滑鼠 器以及基於usb的hid滑鼠器,所以滑鼠器的驅動就分為一種類...