userinit

最後に最初のプロセスを立ち上げる処理を見てみよう.カーネル初期化の最後に,最初のプロセスをスケジューリングするために,schedinitが呼ばれるのだが,プロセスが存在しない場合は,156行目のsetlabelが呼ばれないので,176行目のgotolabelで飛び先がないはずだ.これでは困る.
これでも大丈夫なからくりは,pc/main.cのuserinit関数にある.setlabelを使わず,PCとSPを初期化している.

  207: void
  208: userinit(void)

  237:         p->sched.pc = (ulong)init0;
  238:         p->sched.sp = (ulong)p->kstack+KSTACK-(sizeof(Sargs)+BY2WD);