0

我正在使用 5.2 上游内核。问题是我已经注册了一个NMI_UNKNOWN永远不会被调用的 NMI 处理程序。我可以看到 NMI 计数/proc/interrupts大约每隔几秒钟就会增加一次。

$cat /proc/interrupts | grep NMI
NMI:       1948       1904       1948       1963  Non-maskable interrupts
$cat /proc/interrupts | grep NMI
NMI:       1948       1905       1948       1963  Non-maskable interrupts
$cat /proc/interrupts | grep NMI
NMI:       1948       1905       1948       1964  Non-maskable interrupts

我不太了解 NMI 是如何在 linux 内核中实现的,所以请填写。在这方面完全是菜鸟。我的理解是,我收到的 NMI(通过/proc/interrupts/计数确认)来自一些已知资源,因此我的NMI_UNKNOWN处理程序没有被调用。如果我的理解不正确,那么您能否解释一下为什么我的 NMI 处理程序没有被调用?

在我的案例中,我如何确认这些 NMI 来自哪里?任何界面procsysfs可以帮助我吗?

我的内核配置

$cat config | grep NMI
CONFIG_PRINTK_NMI=y
CONFIG_HAVE_ACPI_APEI_NMI=y
CONFIG_OPROFILE_NMI_TIMER=y
CONFIG_HAVE_NMI=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
# CONFIG_DEBUG_NMI_SELFTEST is not set

编辑

我尝试了 NMI 跟踪器,可以反复看到以下日志,这表明可能是谁是源头以及谁在处理它:

n nmi:0_RP0:/sys/kernel/debug/tracing/events/nmi]$ cat ../../trace_pipe | grep -
856591:           <...>-1452534 [004] d.Z. 602920.053471: nmi_handler: perf_event_nmi_handler() delta_ns: 5944 handled: 1
856592:           <...>-1452534 [004] d.Z. 602920.053471: nmi_handler: nmi_cpu_backtrace_handler() delta_ns: 360 handled: 0
856593:           <...>-1452534 [004] d.Z. 602920.053472: nmi_handler: mce_raise_notify() delta_ns: 350 handled: 0
4

0 回答 0