私は自分の新しいを実装しようとしていschedule()
ます。コードをデバッグしたい。
printk
で関数を使用できますsched.c
か?
使っprintk
たけどダメ。私は何を取りこぼしたか?
私は自分の新しいを実装しようとしていschedule()
ます。コードをデバッグしたい。
printk
で関数を使用できますsched.c
か?
使っprintk
たけどダメ。私は何を取りこぼしたか?
schedule()
がどのくらいの頻度で呼び出されるか知っていますか? おそらく、コンピューターが印刷バッファーをログにフラッシュするよりも速く呼び出されます。別のデバッグ方法を使用することをお勧めします。たとえば、QEMU でカーネルを実行し、kernel.syms ファイルをシンボル テーブルとしてロードしてブレークポイントを設定することにより、リモート GDB を使用します。他の仮想化ソフトウェアも同様の機能を提供しています。または、手動でコードを実行します。割り込みハンドラーで printk を使用することは、通常は悪い考えです (パニックや失速の可能性がある場合を除きます)。
表示されているエラーが発生しない場合は、代わりにBUG()
orを使用することを検討してください。BUG_ON(cond)
これらは条件付きのエラー メッセージを表示するものであり、無条件のものほど頻繁に発生するべきではありません。printk
関数自体を編集するschedule()
ことは、通常は悪い考えです (複数の実行キューなどをサポートしたい場合を除きます)。代わりに、スケジューラ クラスを変更する方がはるかに優れており、簡単です。これを行うには、CFS スケジューラのコードを見てください。他の何かを達成したい場合は、より良いアドバイスを提供できます。
runqueue ロックを保持しているときに printk を呼び出すのは安全ではありません。printk_sched
runqueue ロックを保持しているときに printk を使用するメカニズムを持たせるために、特別な関数が導入されました ( https://lkml.org/lkml/2012/3/13/13 )。残念ながら、ティック内に 1 つのメッセージしか出力できません (また、割り込みが無効になっているため、実行キューのロックを保持している場合は、複数のティックを表示することはできません)。これは、メッセージを保存するために内部バッファが使用されるためです。
ユーザー空間へのロギングにlttng2を使用するかprintk_sched
、ティック内で使用できる静的に割り当てられたバッファーのプールを使用するように の実装にパッチを適用できます。
それは異なりますが、基本的には正常に動作するはずです。
そこにない場合は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回試すことができます。