NMI是什么
NMI(non-maskable interrupt),就是不可屏蔽的中斷。根據Intel的Software Developer手冊Volume 3,NMI的來源有兩個:
– NMI pin
– delivery mode NMI messages through system bus or local APIC serial bus
NMI通常用於通知操作系統發生了無法恢復的硬件錯誤,也可以用於系統調試與采樣,大多數服務器還提供了人工觸發NMI的接口,比如NMI按鈕或者iLO命令等。
- 無法恢復的硬件錯誤通常包括:芯片錯誤、內存ECC校驗錯、總線數據損壞等等。
- 當系統掛起,失去響應的時候,可以人工觸發NMI,使系統重置,如果早已配置好了kdump,那么會保存crash dump以供分析。有的服務器提供了NMI按鈕,而刀片服務器通常不提供按鈕,但可以用iLO命令觸發。
- Linux還提供一種稱為”NMI watchdog“的機制,用於檢測系統是否失去響應(也稱為lockup),可以配置為在發生lockup時自動觸發panic。原理是周期性地生成NMI,由NMI handler檢查hrtimer中斷的發生次數,如果一定時間內這個數字停頓了,表示系統失去了響應,於是調用panic例程。NMI watchdog的開關是通過內核參數 kernel.nmi_watchdog 或者在boot parameter中加入”nmi_watchdog=1″參數實現,比如:
在RHEL上編輯 /boot/grub/menu.lst:
…
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/sda nmi_watchdog=1
…
然后你會看到:
# grep NMI /proc/interrupts
NMI: 0 0 0 0
Linux kernel籠統地把NMI分為三大類:內存校驗錯 mem_parity_error(),總線數據損壞 io_check_error(),其他的全部歸入 unknown_nmi_error()。kernel對NMI是不能精確定位的,對故障診斷很不利,硬件驅動程序可以注冊自己的NMI處理例程,kernel會在發生NMI之后通過notify_die()調用這些第三方注冊的處理例程。
參考資料:
Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3
http://wiki.osdev.org/Non_Maskable_Interrupt
