2

Linuxデバイスドライバー。スピンロックを導入すると、次の例が示されます。

ドライバーが実行中で、デバイスへのアクセスを制御するロックを解除しました。ロックが保持されている間、デバイスは割り込みを発行します。これにより、割り込みハンドラーが実行されます。割り込みハンドラは、デバイスにアクセスする前に、ロックも取得する必要があります。割り込みハンドラーでスピンロックを取得することは、正当なことです。これが、スピンロック操作がスリープしない理由の1つです。しかし、割り込みルーチンが最初にロックを解除したコードと同じプロセッサで実行された場合はどうなりますか?割り込みハンドラーが回転している間、非割り込みコードを実行してロックを解除することはできません。そのプロセッサは永久に回転します。

この問題を解決するにはどうすればよいですか?セマフォを使用していますか?助けてください。

4

1 に答える 1

3

spin_lock_irqsave非割り込みコードから使用して、現在のコアのハードウェア割り込みを無効にするか、同じ章の「ロックの代替方法」セクションで説明されているツールのいずれかを使用します

編集0:

そこにある正確な詳細を覚えていないが、理論は次のとおりです。

  • UPシステムでは、スピンロックはまったく必要ありません。割り込みハンドラーと共有されるデータにアクセスするBHコードからの割り込みを無効にするだけで十分です。
  • SMPシステムでは、他のコアで実行されている同じBHコードから保護するためにスピンロックが必要です。また、ハードウェアを扱う場合は、IRQルーチンでのデッドロックを回避するために、同じコアで割り込みを無効にする必要があります。
  • 割り込みハンドラーは、それ自体とのデッドロックを回避するために、ロックを保持している間は常に割り込みを無効にする必要があります。

お役に立てれば。

于 2012-05-30T14:36:38.100 に答える