console.c void panic(char *s)
トップページ
jupiteroak.hatenablog.com
console.c
https://github.com/mit-pdos/xv6-public/blob/master/console.c#L106
void panic(char *s) { int i; uint pcs[10]; cli(); cons.locking = 0; // use lapiccpunum so that we can call panic from mycpu() cprintf("lapicid %d: panic: ", lapicid()); cprintf(s); cprintf("\n"); getcallerpcs(&s, pcs); for(i=0; i<10; i++) cprintf(" %p", pcs[i]); panicked = 1; // freeze other CPU for(;;) ; }
panic関数は、エラーメッセージを出力してOSの動作を停止させます。
引数 char *s
エラーメッセージの文字列を指定するアドレスです。
処理の内容
cli();
cli関数を呼び出して、ハードウェア割り込みを無効化します。
cons.locking = 0;
コンソールの操作に関連するロックを取得しないようにします。
cprintf("lapicid %d: panic: ", lapicid()); cprintf(s); cprintf("\n");
cprintf関数で、panic関数を呼び出したプロセッサのローカルAPIC IDの値、エラーメッセージ、改行を出力します
getcallerpcs(&s, pcs); for(i=0; i<10; i++) cprintf(" %p", pcs[i]);
getcallerpcs関数を呼び出して、今まで呼び出された各関数で使用されているコールスタックから、リターンアドレスを取得します。
取得したリターンアドレスは配列pcsに格納されているので、この配列pcsとcprintf関数を用いてスタックトレースを表示します。
panicked = 1; for(;;) ;
最後にpanic関数が呼び出されたことを示すフラグをセットして、無限ループの処理に入ります。