30

现在遇到一个关于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 看门狗。

4

2 回答 2

9

答案取决于您的硬件。

不可屏蔽中断 (NMI) 可以通过 2 种方式触发:1) 当内核达到无法被其他方法中断的暂停状态时,以及 2) 由硬件 - 使用 NMI 按钮。

例如,在某些戴尔服务器的正面,您会看到一个小圆圈,里面有一条锯齿线。这是 NMI 符号。附近有个洞。插入一个引脚来触发中断。如果您的内核是为支持它而构建的,这会将内核恐慌跟踪转储到控制台,然后重新启动系统。

这可能发生得非常快。因此,如果您没有连接控制台来将输出保存到文件中,它可能看起来只是重新启动。

于 2013-07-18T23:17:14.203 回答
3

据我所知, nmi_watchdog 只会触发不可中断的挂起。我通过谷歌找到了一个代码示例:http: //oslearn.blogspot.in/2011/04/use-nmi-watchdog.html

如果您的死锁不是不可中断的,您可以尝试启用 sysRq 以触发一些跟踪 (Alt-printscreen-t) 或崩溃 (Alt-printscreen-c) 以获取更多信息。

于 2012-04-16T02:19:30.470 回答