我正在尝试编写一个简单的模块,它应该取代irq 1处理程序。一直以来,我都会遇到以下错误:'-1设备或资源占线'。有办法解决吗?
这是我的代码:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/workqueue.h>
#include <linux/interrupt.h>
#include <asm/io.h>


irqreturn_t myhandler(int irq, void *dev_id, struct pt_regs *regs)
{
  printk(KERN_ALERT"\n\nMy interrupt handler\n\n");
  return IRQ_HANDLED;
}

int init_module()
{
  int res;
  free_irq(1, NULL);
  res = request_irq(1, (void*)myhandler,0, "my_handler", (void*)(myhandler));
  return res;
}

void cleanup_module()
{
  free_irq(1, NULL);
}
MODULE_LICENSE("GPL");

也许任何人都可以说是怎么了。
另外,我正在使用2.6.39.3内核。

最佳答案

您使用的是哪种系统(架构)?
在普通PC机上,IRQ 1是8042(键盘控制器),已经有一个中断处理程序。您正在为request_irq()将0传递到flags中,因此您要求为非共享中断注册处理程序。核心内核中断代码将看到已经有另一个为该IRQ注册的处理程序,并从-EBUSY返回request_irq
不能通过注册同一IRQ的另一个处理程序来重写现有的处理程序。你需要先注销第一个,然后才能注册新的。
您可以查看/proc/interrupts来查看系统上已经在使用IRQ 1的内容。

关于linux - 错误:设备或资源正忙,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8334076/

10-12 04:42