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(&current->context);
  /* ここには返ってこない */
}

ここは現時点でスルーするとして、handlers という配列がある意味カギと見た。定義も使ってあるナニも kozos.c な模様。呼び出され元としては

  • setintr 手続き
  • thread_intr 手続き
    • handler[type] が NULL でなければ handler[type] 呼び出し
  • kz_start 手続き
    • 初期化してます

うう、thread_intr 手続きとか面白いのですがここでナニ。

とりあえず

ぐだ生の時間らしいのでここで一旦止めます。