linux-0.01 読み (8)
0.01 な init は関数になってて main() からの呼び出しは以下。
if (!fork()) { /* we count on this going ok */ init(); }
手続きの定義は init/main.c で以下。
void init(void) { int i,j; setup(); (void) open("/dev/tty0",O_RDWR,0); (void) dup(0); (void) dup(0); printf("%d buffers = %d bytes buffer space\n\r",NR_BUFFERS, NR_BUFFERS*BLOCK_SIZE); printf(" Ok.\n\r"); if ((i=fork())<0) printf("Fork failed in init\r\n"); else if (!i) { close(0);close(1);close(2); setsid(); (void) open("/dev/tty0",O_RDWR,0); (void) dup(0); (void) dup(0); _exit(execve("/bin/sh",argv,envp)); } j=wait(&i); printf("child %d died with code %04x\n",j,i); sync(); _exit(0); /* NOTE! _exit, not exit() */ }
ちょっと setup が謎。なんとなく / を mount してるのかな、というのがぱっと見な印象。手続きの中身てきには
- 標準入出力と標準エラーなディスクリプタを確保
- fork
- 子プロセスは標準入出力と標準エラーを一旦 close して再度作成して execve で /bin/sh をナニ
- 親プロセスは子プロセスな /bin/sh が終わったらメセジを出力して sync() して終了
ここから呼び出されている open() とか dup() とか close() とか fork() とか execve() とか _exit() とかは基本的にシステムコールになっているはず。
とりあえず
セトアプな
time_init(); tty_init(); trap_init(); sched_init(); buffer_init(); hd_init();
の掘削とかシステムコール云々な確認が必要ですが、今日はもう駄目。