カーネルで信号を処理する方法

カーネルで信号を処理する方法

カーネルで信号を処理する方法。カーネルスレッド/プロセスに終了シグナルを送信すると、内部的に何が起こりますか?カーネルプロセスの競合は、カーネルが常にパニックを意味することを意味し、そうでない場合はコアダンプを生成します。

ベストアンサー1

スレッドがカーネルモードでコードを実行すると、シグナルがキューに追加されます。言い換えれば、カーネルは信号が送信されたことを覚えていますが、それに応じてアクションをとることはありません。カーネルスレッドがイベントを待機すると、シグナルによって待機が中断される可能性があります。これはカーネルコードの作成者によって異なります。たとえば、Linux カーネル API には次の機能ペアがあります。wait_eventそしてwait_event_interruptible;スレッドが信号を受信すると、「中断可能」関数のみがすぐに返されます。

カーネルコードは、カーネルメモリまたはハードウェアデバイスを一貫性のない状態にすることができるため、信号によって中断することはできません。したがって、コードは常に整理する機会があります。

Linuxカーネルスレッド(例:スレッド~のカーネル(プロセスリストに対応する実行可能ファイルがリストされていない)はシグナルをまったく受け取ることができません。より正確には、カーネルスレッドに渡されたすべての信号は無視されます。

カーネルコードの競合は、衝突を引き起こしたコードの部分に応じてパニックを引き起こす可能性があります。たとえば、Linuxはドライバコードの競合から回復しようとしますが、これが可能かどうかは何が間違っているかによって異なります。カーネルコードの競合は、カーネルとシステム構成に応じてダンプを生成したり、生成しないことがあります。カーネルクラッシュダンプ器具。

おすすめ記事