私のドライバが2つの異なるIRQラインから2つの異なる割り込みを受け取る必要があるシナリオがあります。 2つの異なるIRQを登録し、単一のドライバ用に2つの異なるハンドラをインストールできますか?これを達成するための最良の方法は何ですか?
PS:これはLinuxデバイスドライバであり、両方のIRQは共有されていません。
答え1
2つの異なるIRQを登録し、単一のドライバ用に2つの異なるハンドラをインストールします。
「とても簡単です」 「可能ですか?」への答えは「はい」です。
同じ CPU のデバイス割り込みルーチンは互いに割り込みません。
LDD3(これはかなり古いもの)によると、単一の割り込みルーチンが複数のCPUで同時に実行されないことを保証します。これが何を意味するのかよく分からない。タイマー割り込みに適用されることを想像することはできません。
あなたのドライバでは、異なる割り込みルーチンが異なるCPUで同時に実行されることを望みます。
しかし、必要に応じてミューテックスを実装する一般的な「スピンロックirqsave」は、この場合でもまだうまく機能します。
テストシステムでNMIウォッチドッグとlockdepが有効になっていることを再確認することをお勧めします:)割り込みルーチン中にCPUが回転状態に閉じ込められると、NMI監視がトリガされます。
答え2
これは完全に可能です。割り込みハンドラを登録すると、ドライバは割り込みがトリガされたときに呼び出される関数のアドレスをカーネルに提供します。ドライバは必要に応じて多くの割り込みを設定でき、すべて同じサービスルーチンを指すことも、すべて独自の割り込み(または他のものの組み合わせ)を指すこともできます。
バラよりこの回答割り込みの実際の処理方法の詳細です。