initプロセス (ユーザコンテキスト)

initプロセスのユーザコンテキストは_main関数から始まる.中身はstartbootを呼んでいるだけ.

pc/init9.c
    1: extern void startboot(char*, char**);
    2: 
    3: void
    4: _main(char *argv0)
    5: {
    6:         startboot(argv0, &argv0);
    7: }

initcodeは標準入出力をopenし,コンソール,サーバ,環境変数バイスを/dev,/srv,/envにbindして,最後に/boot/bootをexecする.詳細はboot(8)やboot/boot.cを参照して欲しいが,bootはルートファイルサーバ(ここではPlan9的なファイルサーバではなく,一般的な意味でのファイルサーバを指す)をmountし,/$objtype/initをexecする.ブート時に"root is from(...): "とプロンプトが出てくるが,この処理をやっているのがbootだ.そして,initが昨日書いたように起動時の名前空間を構築する.

port/initcode.c
    6: #include <u.h>
    7: #include <libc.h>
    8: 
    9: char cons[] = "#c/cons";
   10: char boot[] = "/boot/boot";
   11: char dev[] = "/dev";
   12: char c[] = "#c";
   13: char e[] = "#e";
   14: char ec[] = "#ec";
   15: char s[] = "#s";
   16: char srv[] = "/srv";
   17: char env[] = "/env";
   18: 
   19: void
   20: startboot(char *argv0, char **argv)
   21: {
   22:         open(cons, OREAD);
   23:         open(cons, OWRITE);
   24:         open(cons, OWRITE);
   25:         bind(c, dev, MAFTER);
   26:         bind(ec, env, MAFTER);
   27:         bind(e, env, MCREATE|MAFTER);
   28:         bind(s, srv, MREPL|MCREATE);
   29:         exec(boot, argv);
   30:         for(;;);
   31: }