Start_Kernel (Week 6)
Start_Kernel (Week 6)

Start_Kernel (Week 6)

카테고리
⚙️ Start Kernel
작성자
박용성박용성
작성일
2024년 06월 03일
태그
C
Linux
Slug
start-kernel-6
linux 2.5.75 do_fork 코드 보기
:
long do_fork(unsigned long clone_flags,//clone할때 사용될 플래그
unsigned long stack_start,//새로운 프로세스의 스택 시작 주소
struct pt_regs *regs,//복사될 CPU레지스터 상태를 가리키는 포인터
unsigned long stack_size,//새로운 프로세스의 스택 크기
int __user *parent_tidptr,//부모 thread ID 가리키는 포인터
int __user *child_tidptr)//자식 thread ID 가리키는 포인터
{
struct task_struct *p;
int trace = 0;
long pid;
if (unlikely(current->ptrace)) {//현재 실행중인 프로세스가 trace중인 경우
trace = fork_traceflag (clone_flags);//fork_taceflag 함수 호출해서 추적이 필요 없는 경우 0반환, 필요한 경우 1반환
if (trace)

=> 현재 실행중인 프로세스가 trace 중인 경우 자식 프로세스도 trace되게 한다.
trace : 소프트웨어 프로그램 실행 정보 기록,모니터링해서 디버깅, 문제 감지 등을 한다.

p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr);

=> 프로세스 생성을 위한 초기화 작업. 리눅스 구현 상 허용되지 않은 flag 설정인지 확인한다. copy_process 함수는 부모 프로세스의 메모리 및 시스템 정보를 생성하려는 자식 프로세스에게 복사한다.
  • 주석에 달린 내용을 보면 새로운 thread를 깨우기 전에 이 작업을 수행해야 thread pointer가 invalid되는 경우가 생기는 걸 막을 수 있다고 한다.

pid = IS_ERR(p) ? PTR_ERR(p) : p->pid;

=> 새로 만든 프로세스에 에러가 있는지 확인해, 에러가 없는 경우 pid에 새로 만든 프로세스의 id를 저장한다

if (!IS_ERR(p)) {
struct completion vfork;
. . .
}
return pid;

=> 에러가 없을 경우 안의 함수들 실행하고 최종적으로 생성한 프로세스의 id 반환한다.

if (clone_flags & CLONE_VFORK) {//새로운 프로세스가 vfork로 생성되었을 경우
p->vfork_done = &vfork;//vfork완료 나타내는 변수 설정하고
init_completion(&vfork);//완료 신호 대기열을 초기화한다.
}
if (p->ptrace & PT_PTRACED) {//프로세스가 tracing 상태인지 확인해 SIGSTOP 시그널 설정해서 중지
}
wake_up_forked_process(p);//새로운 프로세스 실행하게 깨우기. copy_process함수를 통해 프로세스 생성을 마치면 함수 호출해서 프로세스 실행 요청
++total_forks;//전체 포크 수 증가
if (unlikely (trace)) {//tracing중인 경우 메시지 설정&시그널 전송
}
if (clone_flags & CLONE_VFORK) {//vfork로 생성되었을 경우
wait_for_completion(&vfork);//race condition 막기 위해 block
ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP);//vfork호출 실행이 완료되었을 때 디버거한테 알리기
} else
set_need_resched();//vfork()로 생성되지 않았을 경우 자식 프로세스를 먼저 실행시켜서 자식이 exec()를 빨리 호출하게 해 메모리 복사 오버헤드를 줄인다

  • fork로 자식 프로세스 만들 때 부모 프로세스의 자원을 복사하는 데 걸리는 시간 때문에 프로세스 생성 시간이 길다는 단점이 있다. 이 단점 보완을 위해 만들어진 게 vfork. vfork는 자원 복사가 이루어지지 않아 부모 프로세스와 자원을 공유한다.

clone_flag
stact_start
pt_regs

댓글

guest