web-dev-qa-db-ja.com

同じドライバーの2つの割り込みハンドラー

ドライバーが2つの異なるIRQラインからの2つの異なる割り込みをリッスンする必要があるシナリオがあります。 2つの異なるIRQを登録し、単一のドライバーに2つの異なるハンドラーをインストールすることは可能ですか?これを達成するための最良の方法は何ですか?

追伸:これはLinuxデバイスドライバーであり、両方のIRQは共有されていません。

4

2つの異なるIRQを登録し、単一のドライバーに2つの異なるハンドラーをインストールします

「それはとても簡単です」。 「可能ですか」に対する答えは「はい」です。


デバイス割り込みルーチンは、同じCPU上で相互に割り込みません。

LDD3(これは現在かなり古い)によると、単一の割り込みルーチンは、複数のCPUで同時に実行されないことが保証されます。これが何を意味するのかわかりません-タイマー割り込みに適用されるとは想像できません。

あなたのドライバーでは、異なるCPUで異なる割り込みルーチンを同時に実行できると思います。

ただし、必要に応じて相互排除を実現するための一般的な「スピンロックirqsave」は、この場合でも正常に機能するはずです。

NMIウォッチドッグ、およびテストシステムでlockdepが有効になっていることを再確認することをお勧めします:)。 NMIウォッチドッグは、CPUが割り込みルーチン内で回転し続けた場合にトリガーされます。

https://static.lwn.net/images/pdf/LDD3/ch10.pdf

1
sourcejedi

これは完全に可能です。割り込みハンドラーを登録するとき、ドライバーは、割り込みがトリガーされたときに呼び出す関数のアドレスをカーネルに提供します。ドライバーは必要な数の割り込みを設定でき、すべてが同じサービスルーチンを指すことも、すべてが独自の(または他の組み合わせ)を指すこともできます。

割り込みが実際に処理される方法の詳細については、 この回答 を参照してください。

1
Steve