我正在尝试为主板上存在的 NMI 硬件按钮创建自定义中断处理程序。
为了测试此功能,我创建了这个简单的模块:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/nmi.h>
static int nmi_custom_handler(unsigned int val, struct pt_regs* regs)
{
pr_info("My custom NMI: 0x%x\n", val);
return NMI_HANDLED;
}
static int __init nmi_handler_init(void) {
pr_info("nmi_handler_init\n");
register_nmi_handler(NMI_UNKNOWN, nmi_custom_handler, 0, "my_custom_nmi");
return 0;
}
static void __exit nmi_handler_exit(void) {
pr_info("nmi_handler_exit\n");
unregister_nmi_handler(NMI_UNKNOWN, "my_custom_nmi");
}
module_init(nmi_handler_init);
module_exit(nmi_handler_exit);
MODULE_AUTHOR("Konstantin Aladyshev <[email protected]>");
MODULE_LICENSE("GPL");
如果我加载此模块并按一次 NMI 按钮,系统中的每个 CPU 核心都会出现“我的自定义 NMI”消息。在“/proc/interrupt”界面中也可以看到同样的情况。对于每个 CPU,NMI 中断计数从 0 增加到 1。但由于某种原因,这只有效一次。我的模块或 /proc 接口不会记录下一个按钮的按下情况。
为什么?我应该更改什么才能再次使用 NMI 硬件中断?