NMI

什么是NMI

Linux 里面经常谈到的 hardirq 和 softirq 是内核处理路径的分类。现在我们要讲的 maskable irq 和 non-maskable irq 是 CPU 硬件入口层的分类。普通的中断(maskable irq)会受到 IF 位的控制。当内核执行 cli 的时候,普通设备 irq, timer irq 这类可屏蔽中断不会被CPU接收,但是NMI / 异常 / SMI 依旧可以打断当前CPU。

cli (clear interrupt flag), sti (set interrupt flag)是x86指令,用于清理/设置 RFLAGS.IF位,linux 内核会通过这些指令控制本CPU 是否接收普通外部可屏蔽中断。

所以NMI 通常用到比较特殊的场景,类似于系统卡住,死锁,内核路径不可抢占等需要打断CPU做诊断或者处理事件的时候。

什么情况下会有NMI

  1. watchdog:系统用来判断一个CPU是否卡死,配置在/proc/sys/kernel/watchdog_thresh,常见默认值10s。
  2. perf / PMU 采样:当使用perf record 命令的时候,PMU counter overflow 会产生PMI,然后PMI 通过触发 NMI delivery 进入内核,记录CPU当前 IP / call stack
  3. 调试/诊断机制:linux 有一些调试机制可以向CPU 发送 NMI,用于dump stack,诊断死锁,panic/kdump等。

怎么看NMI 事件

cat /proc/interrupts
cat /proc/interrupts | rg 'CPU|NMI|PMI'

可以看到系统的每个CPU的所有中断的次数详情。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注