0

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 カーネルで作業しています。

4

1 に答える 1

1

どのタイプのシステム (アーキテクチャ) を使用していますか?

通常の PC では、IRQ 1 は 8042 (キーボード コントローラー) であり、既に割り込みハンドラーを持っています。request_irq()forに0 を渡してflagsいるため、非共有割り込みのハンドラを登録するよう求めています。コア カーネルの割り込みコードは、その IRQ に登録されている別のハンドラが既に存在することを確認し、 から戻り-EBUSYますrequest_irq

同じ IRQ に対して別のハンドラーを登録して、既存のハンドラーをオーバーライドすることはできません。新しいものを登録する前に、最初のものを登録解除する必要があります。

/proc/interrupts を見ると、システムで IRQ 1 を既に使用しているものを確認できます。

于 2011-11-30T23:38:39.247 に答える