核心文件系列 NMI 看門狗

2021-06-16 05:11:36 字數 2196 閱讀 5633

[核心文件系列]

nmi看門狗

秦白衣

[email protected]

[x86和x86-64體系結構均支援nmi看門狗]

你的系統是不是會經常被鎖住(lock up)?直至解鎖,系統不再響應鍵盤?你希望幫助我們解決類似的問題嗎?如果你對所有的問題都回答「yes」,那麼此文件正是為你而寫。

在很多x86/x86-64結構的硬體上,我們都可以使用一種被稱為「看門狗nmi中斷」的機制。(nmi:non maskable interrupt. 這種中斷即使在系統被鎖住時,也能被響應)。這種機制可以被用來除錯核心鎖住現象。通過周期性地執行nmi中斷,核心能夠監測到是否有cpu被鎖住。當有處理器被鎖住時,列印除錯資訊。

為了使用nmi看門狗,首先需要在核心中支援apic。對於smp核心,apic的相關支援已自動地被編譯進核心。對於up核心,需要在核心配置中使能config_x86_up_apic (processor type and features -> local apic support on uniprocessors) 或config_x86_up_ioapic (processor type and features -> io-apic support on uniprocessors)。在沒有io-apic的單處理器系統中,配置config_x86_up_apic。在有io-apic的單處理器系統中,則需配置config_x86_up_ioapic。[注意:某些與核心除錯相關選項可能會禁用nmi看門狗。如:kernel stack meter或kernel tracer]。

對於x86-64系統,apic已被編進核心。

使用本地apic(nmi_watchdog=2)時,需要占用第乙個效能暫存器,因而此暫存器不能再被另作它用(如高精度的效能分析)。oprofile與perfctr的驅動已自動地禁用了本地apic的nmi看門狗。

可以通過啟動引數「nmi_watchdog=n」使能nmi看門狗。即在lilo.conf的相關項中新增如下語句:

對於具有io-apic的smp與up機器,設定nmi_watchdog=1。對於沒有io-apic的up機器,設定nmi_watchdog=2,但僅在某些處理器上可以起作用。如果有疑問,在用nmi_watchdog=1啟動後,再檢視/proc/interrupts檔案中的nmi項,如果該項為0,那麼便用nmi_watchdog=2重新啟動,並再次檢查nmi項。如果還是0,問題就比較嚴重了,你的處理器很可能不支援nmi。

「鎖住(lockup)」是指如下的情況:如果系統中的任何乙個cpu不能處理週期性的本地時鐘中斷,並持續5秒鐘以上,那麼nmi的處理函式將產生乙個oops並殺死當前程序。這是一種「可控崩潰」(controlled crash,所謂可控,是指發生崩潰時,能夠輸出核心資訊),可以用此機制來除錯「鎖住」現象。那麼,無論什麼時候發生「鎖住」,5秒鐘之後都會自動地輸出oops。如果核心沒有輸出資訊,說明此時發生的崩潰過於嚴重(如:hardware-wise),以至於nmi中斷都無法被響應,或者此次崩潰使得核心無法列印資訊。

在使用本地apic時要注意,nmi中斷被觸發的頻率依賴於系統的當前負載。由於缺乏更好的時鐘源,本地apic中的nmi看門狗使用的是「有效週期(cycle unhalted,這個詞的翻譯似乎不太確切,如果某位朋友有更佳的建議,請告知在下。)」事件。也許你已經猜到了,當cpu處於halted(空等)狀態時,該時鐘是不計數的。處理器處於空閒狀態的時候,常出現這樣的情況。如果你的系統在被鎖住時,執行的不是hlt指令,看門狗中斷很快就會被觸發,因為每個時鐘週期都會發生「有效週期」事件。如果不幸,處理器在被鎖住時,執行的恰是「hlt」指令,那麼「有效週期」事件永遠都不會發生,看門狗自然也不會被觸發。這是本地apic看門狗的缺陷,在倒霉的時候,永遠不會進行時鐘計數。而i/o apic中的看門狗由於採用外部時鐘進行驅動,便不存在這個缺陷。但是,它的nmi頻率非常高,會顯著地影響系統的效能。

x86的nmi_watchdog在預設情況下是禁用的,因此你需要在系統啟動的時候使能它。

在系統執行期間,可以禁用nmi看門狗,只要向檔案「/proc/sys/kernel/nmi_watchdog」中寫「0」即可。向該檔案寫「1」,將重新使能看門狗。即使如此,你仍然需要在啟動時使用引數「nmi_watchdog=」。

注意:在2.4.2-ac18之前的核心中,x86 smp平台會無條件地使能nmi-oopser。

硬體看門狗和軟體看門狗

看門狗,又叫watchdog timer,從本質上來說就是乙個定時器電路,一般有乙個輸入和乙個輸出,其中的輸入叫做餵狗,輸出一般連線到另外乙個部分的復位端,另外乙個部分就是所要處理的部分,暫且稱之為mcu。在mcu正常工作的時候,每隔一段時間輸出乙個訊號到餵狗端,給看門狗電路清零,如果在超過規定的時...

關閉看門狗

看門狗作用 在嵌入式領域,有些系統需要長期執行在無人看守的環境。在執行過程中,難免不出現系統宕機的情況,這時就需要系統自身帶有一種自動重啟的功能。watchdog一般是乙個硬體模組,其作用就是在系統宕機時,幫助系統實現重新啟動。看門狗工作方式 watchdog在硬體上實現了計時功能,啟動計時後,使用...

獨立看門狗

用我自己的話來解釋一下看門狗 看門狗就是一段程式正常執行時,阻止程式復位的 另一方面也就是說,程式非正常執行時,不能執行,程式就會產生復位,從而跳出非正常程式執行狀態。在由微控制器構成的微型計算機系統中,由於微控制器的工作常常會受到來自外界電磁場的干擾,造成程式的跑飛,而陷入死迴圈,程式的正常執行被...