错误:设备或资源正忙

错误:设备或资源正忙

问题描述:

我想写一个简单的模块,它应该替换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"); 

也许任何人都可以说,什么是错的。 PS。我正在使用2.6.39.3内核。

你在什么类型的系统(架构)?

在普通PC上,IRQ 1是8042(键盘控制器),并且已经有一个中断处理程序。您将flags传递给request_irq(),因此您要求注册一个非共享中断的处理程序。核心内核中断代码将查看并看到已经为该IRQ注册了另一个处理程序,并从request_irq返回-EBUSY

您不能通过为同一个IRQ注册另一个处理程序来覆盖现有处理程序。您需要取消注册第一个,然后才能注册一个新的。

您可以查看/ proc/interrupts以查看您的系统上已经使用IRQ 1的内容。

+0

好吧,但是'free_irq(1,NULL)''呢?它应该取消注册默认处理程序。但是我发现问题(我90%肯定)在free_irq中(试图在同一个irq上使用free_irq 10000次,并且没有发现错误)。 – Roman

+0

'free_irq'的第二个参数是设备ID,如果该指针与现有处理程序的值不匹配,'free_irq'将失败。假设你在PC上,'drivers/input/serio/i8042.c'就是'request_irq',它永远不会传入NULL设备ID。所以你实际上并没有释放现有的处理程序。 – Roland

+0

我真的不明白为什么会发生。我的意思是,在我阅读的所有手册中,free_irq的第二个参数始终是NUll。如果free_irq第二个参数不能为NULL,那么如何获取id来移除默认处理程序? – Roman