0

システムをクラッシュさせている「アトミックでのスケジューリング」のため、カーネルコードをデバッグしようとしています。実際のカーネルモジュールのある時点で、別のカーネルモジュールで定義された関数を呼び出すための行を追加しました (これは私が作成したものです)。呼び出しは次のとおりです。

mycallback(svc, skb);

関数mycallback()は を返しますint。だから私は2つの質問があります:

  1. 結果を変数に代入せずに、カーネル内で非 void 関数を呼び出すことは安全ですか?

  2. 呼び出されるコードmycallback()が spin_locked などである場合、安全でしょうか? それは spin_locked/atomic でしょうか、それともスリープしてカーネルを危険にさらす可能性がありますか?

4

1 に答える 1

4

結果を変数に代入せずに、カーネル内で非 void 関数を呼び出すことは安全ですか?

はい。

呼び出されるコードmycallback()が spin_locked などである場合、安全でしょうか? それは spin_locked/atomic でしょうか、それともスリープしてカーネルを危険にさらす可能性がありますか?

呼び出すコードがmycallback()スピンロックを保持できる場合は、スリープできる関数を呼び出してはmycallback() なりません。スピンロックを保持している間にスリープしようとすると、説明した「アトミック中のスケジューリング」クラッシュが表示されます。

スリープ状態になる可能性のある関数には、、、copy_to_user()(フラグなし)、copy_from_user()およびその他多数の関数が含まれます。kmalloc()GFP_ATOMICmutex_lock()

于 2012-08-02T06:18:32.477 に答える