130|1

4

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

《Linux内核深度解析》之进程的创建 [复制链接]

进程的创新主要有fork、clone等的系统调用来完成。通过函数_do_fork实现。

_do_fork主要完成以下工作:

1、调用copy_process函数

2、调用wake_up_new_task函数唤醒新进程

/*
 *  Ok, this is the main fork-routine.
 *
 * It copies the process, and if successful kick-starts
 * it and waits for it to finish using the VM if required.
 */
long do_fork(unsigned long clone_flags,
          unsigned long stack_start,
          struct pt_regs *regs,
          unsigned long stack_size,
          int __user *parent_tidptr,
          int __user *child_tidptr)
{
    struct task_struct *p;
    int trace = 0;
    long pid;

    if (unlikely(current->ptrace)) {
        trace = fork_traceflag (clone_flags);
        if (trace)
            clone_flags |= CLONE_PTRACE;
    }

    p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr);
    /*
     * Do this prior waking up the new thread - the thread pointer
     * might get invalid after that point, if the thread exits quickly.
     */
    pid = IS_ERR(p) ? PTR_ERR(p) : p->pid;

    if (!IS_ERR(p)) {
        struct completion vfork;

        if (clone_flags & CLONE_VFORK) {
            p->vfork_done = &vfork;
            init_completion(&vfork);
        }

        if ((p->ptrace & PT_PTRACED) || (clone_flags & CLONE_STOPPED)) {
            /*
             * We'll start up with an immediate SIGSTOP.
             */
            sigaddset(&p->pending.signal, SIGSTOP);
            set_tsk_thread_flag(p, TIF_SIGPENDING);
        }

        p->state = TASK_STOPPED;
        if (!(clone_flags & CLONE_STOPPED))
            wake_up_forked_process(p);    /* do this last */
        ++total_forks;

        if (unlikely (trace)) {
            current->ptrace_message = pid;
            ptrace_notify ((trace << 8) | SIGTRAP);
        }

        if (clone_flags & CLONE_VFORK) {
            wait_for_completion(&vfork);
            if (unlikely (current->ptrace & PT_TRACE_VFORK_DONE))
                ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP);
        } else
            /*
             * Let the child process run first, to avoid most of the
             * COW overhead when the child exec()s afterwards.
             */
            set_need_resched();
    }
    return pid;
}

copy_process函数的主要工作:

  1. 通过dup_task_struct函数为进程分配内存空间。
  2. 通过sched_fork函数为进程设置调度器
  3. 通过copy_semundo、copy_files、copy_fs、copy_sighand、copy_signal、copy_mm、copy_namespaces、copy_io、copy_thread_tls函数复制共享资源。

 

wake_up_new_task函数的主要工作:

  1. 将新进程的状态切换到TASK_RUNNING
  2. 将新进程加入到运行队列

最新回复

谢谢楼主,学习了   详情 回复 发表于 前天 17:12
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

谢谢楼主,学习了

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/5 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表