1

Linuxドライバーの割り込みとIOポートを理解する手段として、単純なキーロガーを作成しています。私が読んだことから、割り込みハンドラを登録する必要があります...

int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *dev_name, void *dev_id);

ただし、私も読んだことから、module_init() 中に request_irq を呼び出すと、割り込みを占有します。私の問題は、割り込みを他のリソースと共有したいのですが、この割り込みを呼び出す方法がわかりません。module_init() で関数を呼び出して、フラグを SA_SHIRQ に設定できたらいいのにと思います。ベスト プラクティスは、割り込みを設定できるようにファイルを開いているときに呼び出すことですが、割り込みハンドラーを実行できるようにするためだけに、open "my_dev" を呼び出すユーザー空間プログラムの作成に依存したくありません。

ありがとう

4

2 に答える 2

2

心配しないで。 request_irq割り込みを「独り占め」しません。コールバックのリストにハンドラーを配置し、その割り込みが通知されるたびに (その IRQ の) すべてのハンドラーを呼び出します。

割り込み中に実行することが重労働である場合は、ドライバーが使用されていないときのシステムの中断を最小限に抑えるために、ドライバーが開いているときにのみ IRQ の処理を​​有効にすることをお勧めします。これを行うには、ドライバーの open 呼び出しと close 呼び出しを実装し、参照カウントを保持します。参照カウント > 0 の場合のみ、ISR を登録する必要があります。

于 2012-04-04T05:01:13.800 に答える
1

最初にそれを機能させ、後でベストプラクティスについて心配してください。IRQ を要求することmodule_initは大したことではありません - 割り込みハンドラが必要とするすべてのリソースがすぐに呼び出されるために利用可能である限り...

于 2012-04-04T05:04:40.063 に答える