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