ARM Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

202239
1625
172599


[리눅스커널] 프로세스: copy_process() 함수 분석 4. 프로세스(Process) 관리

프로세스를 생성하는 핵심 동작은 copy_process() 함수에서 수행합니다. 대부분 부모 프로세스에 있는 리소스를 복사하는 동작입니다. 그럼 copy_process() 함수 코드를 본격적으로 분석해 봅시다.

https://elixir.bootlin.com/linux/v4.19.30/source/kernel/fork.c
1 static __latent_entropy struct task_struct *copy_process(
2 unsigned long clone_flags,
3 unsigned long stack_start,
4 unsigned long stack_size,
5 int __user *child_tidptr,
6 struct pid *pid,
7 int trace,
8 unsigned long tls,
9 int node)
10 {
11 int retval;
12 struct task_struct *p;
...
13 retval = -ENOMEM;
14 p = dup_task_struct(current, node);
15 if (!p)
16 goto fork_out;
...
17 /* Perform scheduler related setup. Assign this task to a CPU. */
18 retval = sched_fork(clone_flags, p);
19 if (retval)
20 goto bad_fork_cleanup_policy;
21
...
22 retval = copy_files(clone_flags, p);
23 if (retval)
24 goto bad_fork_cleanup_semundo;
25 retval = copy_fs(clone_flags, p);
26 if (retval)
27 goto bad_fork_cleanup_files;
28 retval = copy_sighand(clone_flags, p);
29 if (retval)
30 goto bad_fork_cleanup_fs;

먼저 14번째 줄을 봅시다.

14 p = dup_task_struct(current, node);
15 if (!p)
16 goto fork_out;

dup_task_struct() 함수는 생성할 프로세스의 태스크 디스크립터인 task_struct 구조체와 커널 프로세스 스택 공간을 할당합니다. 이후 task_struct 구조체 주소를 반환합니다. dup_task_struct() 함수를 호출해 태스크 디스크립터를 p에 저장합니다.

다음으로 18번째 줄을 보겠습니다.

18 retval = sched_fork(clone_flags, p);
19 if (retval)
20 goto bad_fork_cleanup_policy;

태스크 디스크립터를 나타내는 task_struct 구조체에서 스케줄링 관련 정보를 초기화합니다.

다음으로 22~27번째 줄을 분석하겠습니다.

22 retval = copy_files(clone_flags, p);
23 if (retval)
24 goto bad_fork_cleanup_semundo;
25 retval = copy_fs(clone_flags, p);
26 if (retval)
27 goto bad_fork_cleanup_files;

여기서는 프로세스의 파일 디스크립터 관련 내용(파일 디스크립터, 파일 디스크립터 테이블)을 초기화합니다. 부모 file_struct 구조체의 내용을 자식 프로세스에게 복사합니다. 만약 프로세스 생성 플래그 중 CLONE_FILES로 프로세스를 생성했을 경우 참조 카운트만 증가합니다.

다음으로 분석할 코드는 29번째 줄입니다.

28 retval = copy_sighand(clone_flags, p);
29 if (retval)
30 goto bad_fork_cleanup_fs;

프로세스가 등록한 시그널 핸들러 정보인 sighand_struct 구조체를 생성해서 복사합니다.

이번 절까지 프로세스를 생성하는 함수를 살펴봤습니다. 이번 절에서는 copy_process() 함수를 실행해 부모 프로세스의 리소스를 새로 생성하는 프로세스의 task_struct 구조체에 복제하는 과정을 살펴봤습니다.

그런데 프로세스를 생성하는 과정은 여기서 끝일까요? 그렇지 않습니다. 생성한 프로세스를 바로 실행해야 합니다. 다음 절에서 이 내용을 다루겠습니다.

* 유튜브 강의 동영상도 있으니 같이 들으시면 좋습니다. 





#프로세스

프로세스 소개 
프로세스 확인하기  
프로세스는 어떻게 생성할까?  
유저 레벨 프로세스 실행 실습  
커널 스레드  
커널 내부 프로세스의 생성 과정   
프로세스의 종료 과정 분석  
태스크 디스크립터(task_struct 구조체)  
스레드 정보: thread_info 구조체  
프로세스의 태스크 디스크립터에 접근하는 매크로 함수  
프로세스 디버깅  
   * glibc의 fork() 함수를 gdb로 디버깅하기  


"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2


Thanks,
Austin Kim

핑백

덧글

댓글 입력 영역