내 마더보드에 있는 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 코어에 "My Custom NMI" 메시지가 나타납니다. "/proc/interrupt" 인터페이스에서도 동일한 상황을 볼 수 있습니다. NMI 인터럽트 카운트는 각 CPU에 대해 0에서 1로 증가합니다. 그러나 어떤 이유로 이것은 한 번만 작동합니다. 내 모듈 또는 /proc 인터페이스가 다음 버튼 누름을 기록하지 않습니다.
왜? NMI 하드웨어 인터럽트를 다시 사용하려면 무엇을 변경해야 합니까?