# 사용자 포인터를 공통 exec 경로로 넘깁니다

v6.18.37 / fs/exec.c

execve는 새 프로세스를 하나 더 만드는 호출이 아니라 현재 프로세스가 실행할 프로그램을 바꾸는 요청입니다. 여기서는 native 사용자 인자 포인터를 공통 표현으로 감싸서 execveat 계열과 공통인 경로로 넘기는 작은 진입 함수를 봅니다. ELF 로딩과 주소 공간 교체 전체가 이 여덟 줄에 들어 있는 것은 아닙니다.

## do_execve

```c

static int do_execve(struct filename *filename,
	const char __user *const __user *__argv,
	const char __user *const __user *__envp)
{
	struct user_arg_ptr argv = { .ptr.native = __argv };
	struct user_arg_ptr envp = { .ptr.native = __envp };
	return do_execveat_common(AT_FDCWD, filename, argv, envp, 0);
}

```

### 1928행

```c

static int do_execve(struct filename *filename,

```

실행 파일을 나타내는 커널 filename과 사용자 argv·envp 주소를 받아 exec 공통 경로에 넘깁니다. 성공 시 현재 태스크의 프로그램이 바뀌며 실패하면 음수 오류가 반환됩니다.

### 1929행

```c

	const char __user *const __user *__argv,

```

사용자 주소 공간에 있는 argv 포인터 배열을 받습니다. 배열의 각 원소도 사용자 문자열을 가리키며 __user는 이후 안전한 사용자 접근 경로를 따라야 하는 주소임을 표시합니다. 포인터가 보관하는 것은 객체의 주소입니다. 이 선언만으로 대상 구조체나 문자열의 내용이 복사되지는 않습니다.

### 1930행

```c

	const char __user *const __user *__envp)

```

사용자 환경 문자열 포인터 배열을 받습니다. 여기서 내용을 즉시 역참조하지 않고 아래 user_arg_ptr 형식에 담아 공통 exec 경로로 넘깁니다. 포인터가 보관하는 것은 객체의 주소입니다. 이 선언만으로 대상 구조체나 문자열의 내용이 복사되지는 않습니다.

### 1932행

```c

	struct user_arg_ptr argv = { .ptr.native = __argv };

```

native 사용자 인자 배열 포인터를 공통 인자 형식에 담습니다. 문자열을 이 자리에서 전부 읽지 않습니다.

### 1933행

```c

	struct user_arg_ptr envp = { .ptr.native = __envp };

```

환경 문자열 배열의 사용자 포인터도 같은 공통 표현으로 맞춥니다.

### 1934행

```c

	return do_execveat_common(AT_FDCWD, filename, argv, envp, 0);

```

native 인자를 파일 디스크립터 기준 exec 공통 경로로 넘깁니다. AT_FDCWD는 현재 디렉터리 기준을 뜻합니다.

