0

tl; dr:タイムアウトが指定されている場合でも、読み取りファイル記述子(procfsカーネルモジュールを指す)に対するselect呼び出しが無期限にブロックされる可能性がありますか?

私は、サービスへのアクセスを管理するいくつかのカーネルモジュールがある組み込みLinuxシステムで作業しています。そのようなモジュールの1つは、VLANの状態の変化を監視します。インターフェイスを。の下のディレクトリにエクスポートします/proc。プロセスは、そこで作成されたproc_fileから読み取ろうとすることにより、このモジュールに通知をバインドできます。変更があると、モジュールはそのインターフェースでデータを提供し、呼び出し元の読み取りはその情報とともに返されます。

カーネルモジュールがカーネルセマフォ(struct semaphore)で呼び出し元の読み取りをブロックするため、これが問題を引き起こしているように見えます。これにより、発信者は「D」または中断できないブロック状態になります。プロセスを適切に強制終了することはできず、終了すると機能しなくなります。それは機能していないだけでなく、そのリソースを解放していません。

これは「そうしないでください」の場合だと思いますが、私はカーネルモジュールの専門家ではありません。モジュール内でspinlockまたはwait_event_interruptableを使用するのがより良いアプローチのようです。これらのレガシーカーネルモジュールを変更することは大変なことなので、読み取りを行う前にselectでFDをチェックすることで回避しようとしました。ただし、それも無期限にブロックされているように見えます。

カーネルモジュールで使用されているミューテックスを変更せずにこれを修正する方法はありますか?

4

1 に答える 1

1

Linuxでは、カーネルモジュールが、正しいプログラムを破壊するあらゆる種類の悪意のあることを実行できます。「バグのあるモジュールや悪意のあるモジュールをロードしない」よりも良い答えはないのではないかと思います。あなたの場合、それらが必要なので、おそらくそれらを修正する必要があります。

于 2012-09-27T02:49:45.393 に答える