【问题标题】:Error: Device or resourse is busy错误:设备或资源正忙
【发布时间】:2011-12-01 07:38:39
【问题描述】:

我正在尝试编写一个简单的模块,它应该替换 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 内核。

【问题讨论】:

    标签: linux linux-kernel linux-device-driver interrupt-handling


    【解决方案1】:

    您使用哪种类型的系统(架构)?

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

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

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

    【讨论】:

    • 好的,但是'free_irq(1, NULL);'呢?它应该取消注册默认处理程序。但是我刚刚发现问题(我 90% 确定)出在 free_irq 上(尝试在同一个 irq 上使用 free_irq 10000 次,没有发现错误)。
    • free_irq 的第二个参数是设备 ID,如果该指针与现有处理程序的值不匹配,free_irq 将失败。假设您在 PC 上,drivers/input/serio/i8042.c 就是 request_irq 的作用,它永远不会传入 NULL 设备 ID。所以你实际上并没有释放现有的处理程序。
    • 我真的不明白为什么会这样。我的意思是,在我阅读的所有手册中,free_irq 的第二个参数始终为 NULL。而如果free_irq第二个参数不能为NULL,那么如何获取id来移除默认handler?
    • 不确定你读的是什么“手册”,但如果你查看实际的内核源代码,你会发现 free_irq 的第二个参数几乎从不为 NULL。您需要传入与原始 request_irq() 相同的值。可能最简单的做法是只注册第一个 IRQ——即在 PC 上不要加载 i8042 驱动程序。
    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 2022-10-16
    • 2023-02-10
    • 2017-09-02
    • 2012-01-28
    • 1970-01-01
    • 2016-08-29
    • 2015-09-24
    相关资源
    最近更新 更多