免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9665 | 回复: 6
打印 上一主题 下一主题

紧急!Linux内核2.6关于NMI的处理! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-25 17:43 |只看该作者 |倒序浏览
本人现在遇到一个关于NMI Watchdog的问题,非常紧急,忘各位高手指教。

我想利用NMI不可屏蔽的特性,在CPU遇到严重hang(如关中断时进入死循环)的情况下发出NMI中断进行恢复。Linux支持nmi_watchdog,于是我在在开机启动项中加了nmi_watchdog=1一行,开机后cat /proc/interrupt也确实看到NMI一行有每时每刻都在发生变化。然后加载了一个模块进行测试,我在模块中关闭本地中断后进入一个死循环。按理说这种情况下nmi_watchdog应该起作用,但我加载模块之后系统完全失去响应,过了很久什么都没发生(panic都没有)

我查看了内核源码,Intel manual和《ULK3》,发现以下几个问题:

首先《ULK3》一书关于nmi_watchdog的描述非常矛盾,中文版第243页——检查非屏蔽中断(NMI)监视器:
看门狗基于本地和I/O APIC一个巧妙的硬件特性:它们能在每个CPU上产生周期性的NMI中断。因为NMI中断时不能用汇编语言指令cli屏蔽的,所以,即使禁止中断,看门狗也能检测到死锁。
但后面又说
因而,一旦每个时钟节拍到来,所有的CPU,不管其正在做什么,都开始执行NMI中断处理程序;该中断处理程序又调用do_nmi()。这个函数获得CPU的逻辑号n,然后检测irq_stat数组第n项的apic_timer_irqs字段。如果该CPU字段工作正常,那么,第n项的值必定不同于在前一个NMI中断读取的值……当NMI中断处理程序检测到一个CPU冻结时,就会敲响所有的钟:它把引起恐慌的信息记录在系统日志文件中……

一、第一段话说APIC能周期性的产生NMI,但我查阅《Intel Manual 3A》 Chapter 8, ADVANCED PROGRAMMABLE INTERRUPT CONTROLLER (APIC),这一章完全没有提到APIC能周期性地产生NMI,但每个Local APIC能周期性地产生local timer interrupt。那么Linux nmi_watchdog到底是如何触发NMI的?

二、而按照第二段的说法,NMI是每个时钟节拍都会产生,并且CPU都会处理。而/proc/interrupt的信息显示,NMI中断的产生次数确实与local timer中断次数几乎一样,那么nmi_watchdog的工作方式就相当奇怪了。如果是这样的话,就是说NMI是与timer中断一同触发的吗?也就是说,只要NMI发生了,timer也一同发生,那么每次do_nmi()检测到的apic_timer_irqs应该都与上次不一样,watchdog不就失去作用了吗?

三、我查看了同样版本的源码,do_nmi()的调用路径大概是这样:do_nmi()->default_do_nmi()->nmi_watchdog_tick(),在nmi_watchdog_tick()中有这样一段代码:
  1.                 local_inc(&__get_cpu_var(alert_counter));
  2.                 if (local_read(&__get_cpu_var(alert_counter)) == 5 * nmi_hz)
  3.                         /*
  4.                          * die_nmi will return ONLY if NOTIFY_STOP happens..
  5.                          */
  6.                         die_nmi("BUG: NMI Watchdog detected LOCKUP",
  7.                                 regs, panic_on_timeout);
复制代码
而函数die_nmi()中又调用了panic()。但我加载关中断+无限循环模块后,系统完全失去响应,也没有panic,为什么?

四、按说我只关闭了本地中断local_irq_disable,另一个核应该能有响应,为何我只关了一个核的中断,整机都没有响应了呢?

我的系统是Ubuntu 10.04 LTS,Linux-2.6.32.21-generic,Intel Pentium 4双核CPU。

请问有哪位高手非常清楚Linux下nmi_watchdog的工作原理?设置nmi_watchdog=1之后Linux如何利用NMI进行检测和panic的?
谢谢

论坛徽章:
0
2 [报告]
发表于 2012-03-25 22:49 |只看该作者
是不是因为你的系统开抢占了?

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
3 [报告]
发表于 2012-03-26 00:16 |只看该作者
本帖最后由 linuxfellow 于 2012-03-26 00:27 编辑

回复 1# fight_watchdog
看门狗和平台有关。有些平台看门狗是不可靠的。假如由于某种原因,系统时钟紊乱,或其代码执行逻辑出现完全混乱时,其看门狗不一定会有中断发生。
我们一般加一个外部硬件看门狗,独立于cpu, 这样就能保证看门狗可靠动作。

不知道究竟如何,你可以对着下面文档看看:
Documentation / nmi_watchdog.txt

   

论坛徽章:
0
4 [报告]
发表于 2012-03-26 08:11 |只看该作者
回复 2# wmiss414


跟开抢占有什么关系吗?

论坛徽章:
0
5 [报告]
发表于 2012-03-26 08:38 |只看该作者
回复 3# linuxfellow


谢谢~我主要是想了解Linux nmi_watchdog的具体工作机制是什么,尤其是,NMI是如何触发的
Documentation/nmi_watchdog.txt我看过,令我很疑惑,因为它还是没说NMI到底是怎么被触发的……

"Be aware that when using local APIC, the frequency of NMI interrupts it generates, depends on the system load. The local APIC NMI watchdog, lacking a better source, uses the "cycles unhalted" event. "
根据系统负载?"cycles unhalted"也说得很抽象……《ULK3》倒是说得很清楚,但很矛盾

"but if your system locks up on anything but the "hlt" processor instruction, the watchdog will trigger very soon as the "cycles unhalted" event will happen every clock tick."
"If it locks up on "hlt", then you are out of luck -- the event will not happen at all and the watchdog won't trigger. "
为何执行了hlt指令,watchdog就不会触发了?我查了《Intel Manual, 2A》,对hlt的描述是这样的:
"Stops instruction execution and places the processor in a HALT state. An enabled interrupt (including NMI and SMI), a debug exception, the BINIT# signal, the INIT# signal, or the RESET# signal will resume execution."
显然,即使CPU执行了hlt,也能被NMI唤醒。我认为这里的关键是文档中所说的"cycles unhalted"具体是指什么。
请指教。

P.S. 小弟初来乍到chinaunix,这论坛的验证问答也太扯淡了吧……

论坛徽章:
0
6 [报告]
发表于 2012-04-17 17:30 |只看该作者
我们的环境中,在加载ko的时候,偶现panic
于是也加载了一个模块进行测试,我在模块中关闭本地中断后进入一个死循环。这种情况下nmi_watchdog起作用,很快就发生了oops,我们的内核是非抢占的内核;

论坛徽章:
0
7 [报告]
发表于 2013-08-23 15:02 |只看该作者
nmi_watchdog与nmi中断的一些源码与文档分析总结,并请大牛点拨疑问
http://bbs.chinaunix.net/forum.p ... mp;fromuid=28788494

试着对新版本中nmi中断的触发做了回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP