如何在Ubuntu Linux上通过硬件中断验证中断处理程序及驱动代码
如何用键盘按键中断验证你的Linux中断驱动
先修正你的驱动代码问题
你的原代码硬编码了固定IRQ号(50),这在实际系统中不可靠——不同设备的IRQ号不固定,且直接请求键盘的IRQ会和系统自带的键盘驱动冲突。下面是适配键盘中断测试的修改版代码:
#include <linux/kernel.h> #include <linux/init.h> #include <linux/interrupt.h> // 替换为你从系统中查到的键盘IRQ号 static int irq = 1; static void *irq_dev_id = &irq; // 共享中断必须提供唯一标识 static irqreturn_t peripheral_interrupt_handler(int irq, void *data) { pr_info("Interrupt triggered! IRQ: %d\n", irq); return IRQ_HANDLED; } static int __init peripheral_interrupt_init(void) { int ret; pr_info("Requesting IRQ %d\n", irq); // 加入IRQF_SHARED实现中断共享,避免和系统驱动冲突 ret = request_irq(irq, peripheral_interrupt_handler, IRQF_TRIGGER_RISING | IRQF_SHARED, "peripheral_interrupt", irq_dev_id); if (ret) { pr_err("Failed to request IRQ %d: %d\n", irq, ret); return ret; } pr_info("Interrupt handler registered for IRQ %d\n", irq); return 0; } static void __exit peripheral_interrupt_exit(void) { free_irq(irq, irq_dev_id); pr_info("Interrupt handler unregistered\n"); } module_init(peripheral_interrupt_init); module_exit(peripheral_interrupt_exit); MODULE_LICENSE("GPL");
验证步骤
1. 查找键盘的IRQ号
执行以下命令查看系统中断分配:
cat /proc/interrupts
找到键盘相关条目,比如PS/2键盘通常对应i8042或atkbd,其开头的数字就是IRQ号(比如1);USB键盘则会在usb-ohci或usbhid条目下。
2. 编译驱动
创建Makefile:
obj-m += peripheral_interrupt.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
执行make编译生成.ko驱动文件。
3. 加载驱动并测试
共享中断模式(推荐,无需卸载系统驱动):
- 加载驱动:
sudo insmod peripheral_interrupt.ko - 实时查看内核日志:
dmesg -w - 按下键盘任意按键,日志中会出现
Interrupt triggered! IRQ: X的输出,说明你的中断处理程序被触发。
- 加载驱动:
独占中断模式(需临时禁用系统键盘驱动):
- 卸载系统键盘驱动(PS/2键盘):
(USB键盘执行sudo rmmod atkbdsudo rmmod usbhid,注意这会禁用所有USB输入设备,建议用远程终端或备用输入设备操作) - 加载你的驱动,按下键盘按键查看
dmesg输出。 - 测试完成后,恢复系统驱动:
sudo rmmod peripheral_interrupt sudo modprobe atkbd
- 卸载系统键盘驱动(PS/2键盘):
注意事项
- 共享中断时,
dev_id必须是唯一的非空指针,否则内核无法区分不同的中断处理程序。 - 若使用USB键盘,IRQ号可能随系统重启动态变化,建议后续学习通过设备树或sysfs动态获取IRQ,而非硬编码。
- 不要长时间禁用系统键盘驱动,避免无法操作系统。
内容的提问来源于stack exchange,提问作者manju.g.r.
相关产品推荐
相关产品推荐

