Linux の割り込みハンドラで printk または (I/O) が禁止されているのはなぜですか? 割り込みハンドラの I/O が Linux システムでデッドロックを引き起こす可能性があるのはどのような状況ですか?
1 に答える
に関してprintk()
は、押し付けがましいです。たとえば、デバッグ中の問題は、printk を追加することで消える場合があります。設定によっては、コンソールへの出力が遅くなる場合があります。trace_printk()
代わりにftraceを使用することをお勧めします。
interrupt 内の I/Oについては、割り込みは他の実行スレッドよりも高い優先度で実行されることを覚えておいてください。そのため、I/O であろうと他のものであろうと、レイテンシはシステムの残りの部分に影響を与えます。
リソースの競合が原因でデッドロックが発生する可能性があります。たとえば、ミューテックスなどの 1 つのリソースが、プロセス コンテキストで実行されているカーネル スレッドによって既に使用されているときに、割り込みが到着します。割り込みサービス ルーチンが同じリソースを取得しようとすると、デッドロックが発生します。ISR の優先度が高いため、カーネル スレッドは実行できず、カーネル スレッドが保持するリソースを待機しているため、ISR は終了できません。
それがあなたの質問に答えることを願っています。
printk
更新:割り込みハンドラーを呼び出すとデッドロックが発生しますか? いいえ。たとえば、makelinux からのこの抜粋
すぐに当然のことと思われる printk() の特性の 1 つは、その堅牢性です。printk() 関数は、いつでもカーネルのどこからでも呼び出すことができます。割り込みまたはプロセス コンテキストから呼び出すことができます。ロックが保持されている間に呼び出すことができます。複数のプロセッサで同時に呼び出すことができますが、呼び出し元がロックを保持する必要はありません。
UPDATE2: tc2keatsのおかげで注意が必要です。
ただし、printk が ISR にある場合、それが製品コードである可能性は低いです。おそらくデバッグ中。したがって、ロックアップがある場合、それはプログラマーに明らかになるはずです:)