现在遇到一个关于Linux NMI Watchdog 的问题。我想使用 Linux NMI 看门狗来检测和恢复操作系统挂起。因此,我将“nmi_watchdog=1”添加到 grub.cfg 中。然后检查/proc/interrupt,NMI 每秒被触发。但是在我加载一个带有死锁的模块(双重获取自旋锁)后,系统完全挂起,没有任何反应(永远不要恐慌!)。看起来 NMI 看门狗不起作用!
然后我阅读了 Documentation/nmi_watchdog.txt,上面写着:
请注意,使用本地 APIC 时,它生成的 NMI 中断频率取决于系统负载。缺少更好的源的本地 APIC NMI 看门狗使用“ cycle unhalted ”事件。
什么是“循环未停止”事件?
它补充说:
但是,如果您的系统锁定除“hlt”处理器指令之外的任何内容,则看门狗将很快触发,因为每个时钟滴答都会发生“循环未停止”事件......如果它锁定在“hlt”上,那么你就出局了幸运的是——事件根本不会发生,看门狗也不会触发。
如果处理器执行“hlt”指令,似乎看门狗不会触发,然后我在“ Intel 64 and IA-32 Architectures Software Developer's Manual, Volumn 2A ”中搜索“hlt”,它的描述如下:
停止指令执行并将处理器置于 HALT 状态。启用的中断(包括 NMI 和 SMI)、调试异常、BINIT# 信号、INIT# 信号或 RESET# 信号将恢复 执行。
然后我就迷路了……
我的问题是:
- Linux NMI 看门狗如何工作?
- 谁触发了 NMI?
我的操作系统是 Ubuntu 10.04 LTS,Linux-2.6.32.21,CPU Pentium 4 Dual-core 3.20 GHz。
我没有阅读有关 NMI 看门狗的完整源代码(没有时间),如果我无法理解 NMI 看门狗是如何工作的,我想使用性能监控计数器中断和处理器间中断(由 APIC 提供)来发送 NMI NMI 看门狗。