NMI 硬件按钮的自定义中断处理程序

NMI 硬件按钮的自定义中断处理程序

我正在尝试为主板上存在的 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 硬件中断?

相关内容