ローカルCPUが割り込みを許可する必要があるのはなぜですか?それ以外の場合、カーネルプリエンプションは実行されませんか?

ローカルCPUが割り込みを許可する必要があるのはなぜですか?それ以外の場合、カーネルプリエンプションは実行されませんか?

私は「Linuxカーネルの理解」という本を読んだ。ローカルCPUでローカル割り込みを有効にする必要があるという文は理解できません。それ以外の場合、カーネルプリエンプションは実行されません。この文はどういう意味ですか?

ベストアンサー1

本に出てくるこの文は間違っていました。 IRQが無効になってもプリエンプションは引き続き発生する可能性があります。一種の。

プリエンプションはさまざまな方法でトリガーできるため難しいです。そのうちの1つだけが割り込みを介しています。たとえば、Schedule()を呼び出して常にコードを直接プリエンプションでき、プリエンプションの有効化/無効化または割り込みは気にしません。 cond_resched() は、割り込みがディセーブルされるかどうかにかかわらず、別の関数です。

だから質問に対する答えは

ローカルCPUが割り込みを許可する必要があるのはなぜですか?それ以外の場合、カーネルプリエンプションは実行されませんか?

しかし、実際にはそうではありません。割り込みが無効になってもプリエンプションは引き続き発生する可能性があります。いつでも発生する可能性のある非同期プリエンプションは、割り込みが無効になっても発生しません。ただし、実行中のコードの連続によるプリエンプションはまだ発生する可能性があります。これに関する警告があります。ドキュメントから

ただし、これらの同期コードパスの一部(例:preempt_enable()経由)は、割り込みが無効になっているとプリエンプションを拒否するため、混乱には役立ちません。他のパス(例:cond_resched())はまだ許可されています。その理由は、関数の明示性によるものである可能性が高い。 cond_resched() は Schedule() と同様の明示的なプリエンプション要求です。 preempt_enable()のようなものはあまり明示的ではなく、誤ってプリエンプションをトリガーする可能性があるため、割り込みが無効になっている場合はプリエンプションを防ぎます。

おすすめ記事