我已经使用
注册了一个中断/* Request INT and set the handler*/
err = request_irq(irq_num, gpio_irq_handler, IRQF_TRIGGER_LOW | IRQF_SHARED, "Test_IRQ", dev);
当我退出模块时,我使用
释放它free_irq(irq_num, dev);
我面临的问题是中断永远不会从/ proc / interrupts文件中清除
我在这里注册了gpio的中断
root@lolly:~# insmod isr.ko
root@lolly:~# cat /proc/interrupts
CPU0 CPU1
165: 701 0 - 5 Test_IRQ
Err: 0
我删除模块,中断是免费的
root@lolly:~# rmmod isr.ko
root@lolly:~# cat /proc/interrupts
CPU0 CPU1
165: 701 0 - 5
Err: 0
但我找到了条目和计数
我再次加载模块
root@lolly:~# insmod isr.ko
root@lolly:~# cat /proc/interrupts
CPU0 CPU1
165: 702 0 - 5 Test_IRQ
Err: 0
我看到计数仍不为零
我造成102次中断
root@lolly:~# cat /proc/interrupts
CPU0 CPU1
165: 804 0 - 5 Test_IRQ
Err: 0
root@lolly:~#
但是这个数字递增了
这种行为是否正确?我希望在释放IRQ时中断条目消失,再次加载时从零开始计数
请问我的观察结果可以纠正我吗?
答案 0 :(得分:0)
我还没有在内核中使用过中断,但我花了一些时间查看内核搜索。
remove_irq
函数基本上只调用__free_irq
。
在此功能中,会发生以下情况:
irq_pm_remove_action
被调用,它与/proc
无关。desc->action == NULL
),irq_shutdown
被调用,这是特定于arch的(在x86上没有做任何事情)并且与/proc
无关unregister_handler_proc
被调用,但如果绝对没有中断报告,这似乎只会尝试删除/proc/interrupts
rmmod
之后),因为处理程序仍然在内存中(我猜))。 show_interrupts
函数确实checks是否存在任何处理程序。所以回答你的第一个问题:
这种行为是否正确?
不,你不应该看到那个中断,因为没有人再加上它了。
如果我猜测,是否有可能在模块的早期版本中忘记remove_irq
,所以先前安装的irq处理程序会留在内核中?重启可以解决这个问题。
请注意,通过查找IRQF_SHARED
指针remove_irq
中断dev
。因此,如果您在没有remove_irq
的情况下删除该模块,则没有删除处理程序的非破解方法。