我正在使用 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 来自哪里?任何界面proc
或sysfs
可以帮助我吗?
我的内核配置
$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