본문 바로가기

Core BSP 분석/리눅스 커널 핵심 분석

copy_mm()함수

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