カーネルモードドライバーを使用しているアプリを実行しようとしています。システムは1時間ごとにロックし、それを回復する唯一の方法はハードリセットです。Sysrqが応答を停止し、telnetセッションがハングし、いかなる種類のエラーメッセージも表示されません。残念ながら、ボードはejtagをサポートしていません。私はそれを機能的に分離しようとしてきましたが、これは干し草の山で針を探すようなものです。助言がありますか?
PS:これはmips linuxシステム(2.6.31)です。
カーネルモードドライバーを使用しているアプリを実行しようとしています。システムは1時間ごとにロックし、それを回復する唯一の方法はハードリセットです。Sysrqが応答を停止し、telnetセッションがハングし、いかなる種類のエラーメッセージも表示されません。残念ながら、ボードはejtagをサポートしていません。私はそれを機能的に分離しようとしてきましたが、これは干し草の山で針を探すようなものです。助言がありますか?
PS:これはmips linuxシステム(2.6.31)です。
状況の詳細に応じて、いくつかのオプションがあります。プラットフォームとカーネル モード ドライバーの性質について詳しく教えていただけると助かります。
ハードウェアに自信があると仮定すると、ロックアップの可能性が高い原因は、カーネルのロックの問題、初期化されていない変数、およびプリエンプションが無効になっている無限ループです。
タイマー割り込みを定期的に実行して LED を点滅させるように構成できますか? ロックアップ中に割り込みが引き続き処理されるかどうかを確認すると便利な場合があります。
Linux カーネル ハッキング メニューでソフト ロックアップ検出を有効にし、その他の関連するカーネル ハッキング機能を有効にします。Linux がソフト ロックアップを検出して報告するまでに 1 ~ 2 分かかる場合があります。これを確認するのに十分長く待ちましたか?
カーネル ハッキングでロック依存関係のチェックを有効にし、ドライバーで報告されたロック エラーを修正します。
カーネル プリエンプション モードを変更してみてください。これにより、一部のシステム ロックの動作が変更され、場合によってはデッドロックが害の少ないロックに変わります。関連する/可能な場合は、SMP を無効にします。
残念ながら、sysreq が動作していない場合や、基盤となるシステムを突く方法がない場合は、運が悪くなります。
システムから何らかの動作を取得できる場合 (おそらくハードウェア ウォッチドッグ?)、kdump をお勧めします。
さらに、これが最近の問題である場合は、まずドライバーのコードを 2 分割して、クラッシュが発生している場所を特定します。
カーネルが完全にハングしておらず、まだ割り込みが発生している場合は、KGDB を使用できる可能性があります。
それができない場合は、ログ コードをドライバーに追加して、問題の原因を突き止めることができます。少なくともすべての関数のエントリに printk() を配置し、おそらく各関数のすべての出口にも配置します。少なくとも、問題が発生している場所を特定するのに役立ちます。