# init 프로그램의 인자와 환경을 넘깁니다

v6.6 / init/main.c

커널 내부에서 실행되던 init 태스크가 사용자 프로그램으로 바뀌려면 파일 이름, 인자 배열, 환경 배열이 준비되어야 합니다. 이 작은 함수는 그 연결을 보여 줍니다. 성공한 exec는 현재 태스크의 프로그램을 바꾸므로 새 자식 프로세스를 만드는 fork와 다릅니다.

## run_init_process

```c

static int run_init_process(const char *init_filename)
{
	const char *const *p;

	argv_init[0] = init_filename;
	pr_info("Run %s as init process\n", init_filename);
	pr_debug("  with arguments:\n");
	for (p = argv_init; *p; p++)
		pr_debug("    %s\n", *p);
	pr_debug("  with environment:\n");
	for (p = envp_init; *p; p++)
		pr_debug("    %s\n", *p);
	return kernel_execve(init_filename, argv_init, envp_init);
}

```

### 1341행

```c

static int run_init_process(const char *init_filename)

```

현재 init 태스크에서 init_filename이 지정한 사용자 프로그램 실행을 시도합니다. int 반환값은 kernel_execve의 결과이며 새 PID를 만드는 함수가 아닙니다.

### 1343행

```c

	const char *const *p;

```

argv나 envp의 문자열 포인터 배열을 한 원소씩 읽을 순회 포인터입니다. *p가 현재 문자열 주소이고 NULL이면 배열 끝입니다. 포인터가 보관하는 것은 객체의 주소입니다. 이 선언만으로 대상 구조체나 문자열의 내용이 복사되지는 않습니다.

### 1345행

```c

	argv_init[0] = init_filename;

```

사용자 프로그램이 받는 첫 번째 인자 포인터를 실행 파일 이름으로 정합니다. 문자열 전체를 복사하지 않습니다.

### 1346행

```c

	pr_info("Run %s as init process\n", init_filename);

```

지금 어떤 사용자 init 파일의 실행을 시도하는지 기록합니다. 이 로그만으로 exec 성공까지 확인한 것은 아니며 실행 호출은 아래에 있습니다.

### 1347행

```c

	pr_debug("  with arguments:\n");

```

뒤의 디버그 출력이 init에 전달할 argv 목록임을 표시합니다. 부팅 실패 때 실제 인자 구성을 확인하기 위한 제목입니다.

### 1348행

```c

	for (p = argv_init; *p; p++)

```

argv_init의 첫 원소부터 NULL까지 이동합니다. 각 회차에서 문자열 내용이 아니라 문자열 포인터 하나를 골라 다음 줄에서 출력합니다.

### 1349행

```c

		pr_debug("    %s\n", *p);

```

현재 배열 원소 *p가 가리키는 문자열 하나를 출력합니다. argv 순회 안에서는 인자, envp 순회 안에서는 환경 문자열을 보여 줍니다.

### 1350행

```c

	pr_debug("  with environment:\n");

```

이후 출력이 argv가 아니라 init의 환경 문자열 envp 목록임을 표시합니다.

### 1351행

```c

	for (p = envp_init; *p; p++)

```

envp_init의 첫 문자열부터 NULL 종결자 전까지 순회합니다. 환경 문자열을 수정하거나 새로 만드는 루프는 아닙니다.

### 1352행

```c

		pr_debug("    %s\n", *p);

```

현재 배열 원소 *p가 가리키는 문자열 하나를 출력합니다. argv 순회 안에서는 인자, envp 순회 안에서는 환경 문자열을 보여 줍니다.

### 1353행

```c

	return kernel_execve(init_filename, argv_init, envp_init);

```

커널이 마련한 파일명·인자·환경으로 현재 태스크의 실행 이미지를 바꿀 공통 exec 경로에 들어갑니다.

