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: }