6

私は自分の新しいを実装しようとしていschedule()ます。コードをデバッグしたい。

printkで関数を使用できますsched.cか?

使っprintkたけどダメ。私は何を取りこぼしたか?

4

4 に答える 4

8

schedule()がどのくらいの頻度で呼び出されるか知っていますか? おそらく、コンピューターが印刷バッファーをログにフラッシュするよりも速く呼び出されます。別のデバッグ方法を使用することをお勧めします。たとえば、QEMU でカーネルを実行し、kernel.syms ファイルをシンボル テーブルとしてロードしてブレークポイントを設定することにより、リモート GDB を使用します。他の仮想化ソフトウェアも同様の機能を提供しています。または、手動でコードを実行します。割り込みハンドラーで printk を使用することは、通常は悪い考えです (パニックや失速の可能性がある場合を除きます)。

表示されているエラーが発生しない場合は、代わりにBUG()orを使用することを検討してください。BUG_ON(cond)これらは条件付きのエラー メッセージを表示するものであり、無条件のものほど頻繁に発生するべきではありません。printk

関数自体を編集するschedule()ことは、通常は悪い考えです (複数の実行キューなどをサポートしたい場合を除きます)。代わりに、スケジューラ クラスを変更する方がはるかに優れており、簡単です。これを行うには、CFS スケジューラのコードを見てください。他の何かを達成したい場合は、より良いアドバイスを提供できます。

于 2013-01-11T22:30:15.577 に答える
2

runqueue ロックを保持しているときに printk を呼び出すのは安全ではありません。printk_schedrunqueue ロックを保持しているときに printk を使用するメカニズムを持たせるために、特別な関数が導入されました ( https://lkml.org/lkml/2012/3/13/13 )。残念ながら、ティック内に 1 つのメッセージしか出力できません (また、割り込みが無効になっているため、実行キューのロックを保持している場合は、複数のティックを表示することはできません)。これは、メッセージを保存するために内部バッファが使用されるためです。

ユーザー空間へのロギングにlttng2を使用するかprintk_sched、ティック内で使用できる静的に割り当てられたバッファーのプールを使用するように の実装にパッチを適用できます。

于 2013-03-28T17:47:26.453 に答える
0

それは異なりますが、基本的には正常に動作するはずです。

そこにない場合はdmesg、シェルで使用してトレースしてみてください。明らかにそれを呼び出していません。printk

2396         if (p->mm && printk_ratelimit()) {
2397                 printk(KERN_INFO "process %d (%s) no longer affine to cpu%d\n",
2398                                 task_pid_nr(p), p->comm, cpu);
2399         }
2400 
2401         return dest_cpu;
2402 }

sched.c動作しprintkないセクションがあります。

1660 static int double_lock_balance(struct rq *this_rq, struct rq *busiest)
1661 {
1662         if (unlikely(!irqs_disabled())) {
1663                 /* printk() doesn't work good under rq->lock */
1664                 raw_spin_unlock(&this_rq->lock);
1665                 BUG_ON(1);
1666         }
1667 
1668         return _double_lock_balance(this_rq, busiest);
1669 }

編集

printk毎回ではなく、1000回に1回試すことができます。

于 2013-01-11T22:31:18.280 に答える