do_fork
p = copy_process(clone_flags, stack_start, regs, stack_size,
child_tidptr, NULL, trace);
retval = copy_signal(clone_flags, p);
if (retval)
goto bad_fork_cleanup_sighand;
retval = copy_mm(clone_flags, p);
if (retval)
goto bad_fork_cleanup_signal;
retval = copy_namespaces(clone_flags, p);
if (retval)
goto bad_fork_cleanup_mm;
retval = copy_io(clone_flags, p);
if (retval)
goto bad_fork_cleanup_namespaces;
retval = copy_thread(clone_flags, stack_start, stack_size, p, regs);
// 현재 task(current)에서 mm을 두번째 파마리터에 복사를 함.
static int copy_mm(unsigned long clone_flags, struct task_struct *tsk)
{
struct mm_struct *mm, *oldmm;
int retval;
tsk->min_flt = tsk->maj_flt = 0;
tsk->nvcsw = tsk->nivcsw = 0;
#ifdef CONFIG_DETECT_HUNG_TASK
tsk->last_switch_count = tsk->nvcsw + tsk->nivcsw;
#endif
tsk->mm = NULL;
tsk->active_mm = NULL;
/*
* Are we cloning a kernel thread?
*
* We need to steal a active VM for that..
*/
oldmm = current->mm;
if (!oldmm)
return 0;
if (clone_flags & CLONE_VM) {
atomic_inc(&oldmm->mm_users);
mm = oldmm; // 핵심 루틴
goto good_mm;
}
retval = -ENOMEM;
mm = dup_mm(tsk);
if (!mm)
goto fail_nomem;
good_mm:
/* Initializing for Swap token stuff */
mm->token_priority = 0;
mm->last_interval = 0;
tsk->mm = mm;
tsk->active_mm = mm;
return 0;
fail_nomem:
return retval;
}
'Core BSP 분석 > 리눅스 커널 핵심 분석' 카테고리의 다른 글
MMU - 메모리 설정 (0) | 2023.05.05 |
---|---|
커널패닉 - ext4 파일 시스템 (0) | 2023.05.05 |
커널 에러 로그(1) (0) | 2023.05.05 |
hrtimer_restart, alarm timer (0) | 2023.05.05 |
바인더가 깨질 때의 콜 스택 (0) | 2023.05.05 |