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();

の掘削とかシステムコール云々な確認が必要ですが、今日はもう駄目。