KOZOS (21)
今日はテキトーに過ごそうと昼から酒を注入してるんですが、kozos.c をなんとかしてみようと頑張ってみます。
thread_run 手続き
呼び出し元は
- call_functions 手続き
- kz_start 手続き
な模様。
find . -type f -print0 | xargs -0 -e grep -nH -e 'thread_run' ./kozos.c:97:static kz_thread_id_t thread_run(kz_func_t func, char *name, ./kozos.c:197: p->un.run.ret = thread_run(p->un.run.func, p->un.run.name, ./kozos.c:288: current = (kz_thread *)thread_run(func, name, stacksize, argc, argv);
ええと call_functions 手続きを呼び出してるのは syscall_proc 手続きで、kz_start 手続きを呼び出してるのは main.c の main 手続きなのか。
syscall_proc を呼び出してるのは syscall_intr 手続きだな。で、syscall_intr を云々してるのは kz_start 手続きで以下なナニ。
/* 割込みハンドラの登録 */ setintr(SOFTVEC_TYPE_SYSCALL, syscall_intr); /* システム・コール */ setintr(SOFTVEC_TYPE_SOFTERR, softerr_intr); /* ダウン要因発生 */
ええと
setintr 関連のナニが理解できてないのかな。と思ったら定義は kozos.c らしい。
static int setintr(softvec_type_t type, kz_handler_t handler) { static void thread_intr(softvec_type_t type, unsigned long sp); /* * 割込みを受け付けるために,ソフトウエア・割込みベクタに * OSの割込み処理の入口となる関数を登録する. */ softvec_setintr(type, thread_intr); handlers[type] = handler; /* OS側から呼び出す割込みハンドラを登録 */ return 0; }
thread_intr 手続きも kozos.c なのだろうな。見てみるに行ってらっしゃいなナニらしい。
static void thread_intr(softvec_type_t type, unsigned long sp) { /* カレント・スレッドのコンテキストを保存する */ current->context.sp = sp; /* * 割込みごとの処理を実行する. * SOFTVEC_TYPE_SYSCALL, SOFTVEC_TYPE_SOFTERR の場合は * syscall_intr(), softerr_intr() がハンドラに登録されているので, * それらが実行される. */ if (handlers[type]) handlers[type](); schedule(); /* スレッドのスケジューリング */ /* * スレッドのディスパッチ * (dispatch()関数の本体はstartup.sにあり,アセンブラで記述されている) */ dispatch(¤t->context); /* ここには返ってこない */ }
ここは現時点でスルーするとして、handlers という配列がある意味カギと見た。定義も使ってあるナニも kozos.c な模様。呼び出され元としては
- setintr 手続き
- thread_intr 手続き
- handler[type] が NULL でなければ handler[type] 呼び出し
- kz_start 手続き
- 初期化してます
うう、thread_intr 手続きとか面白いのですがここでナニ。
とりあえず
ぐだ生の時間らしいのでここで一旦止めます。