码迷,mamicode.com
首页 > 系统相关 > 详细

结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程

时间:2020-06-15 20:37:18      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:执行   ike   The   event   进程   its   tac   after   repo   

实验目的

1.以fork和execve系统调用为例分析中断上下文的切换

2.分析execve系统调用中断上下文的特殊之处

3.分析fork子进程启动执行时进程上下文的特殊之处

4.以系统调用作为特殊的中断,结合中断上下文切换和进程上下文切换分析Linux系统的一般执行过程

fork函数调用

do_fork函数实现为:

long do_fork(unsigned long clone_flags,
    unsigned long stack_start,
    unsigned long stack_size,
    int __user *parent_tidptr,
    int __user *child_tidptr)
{
    struct task_struct *p;
    int trace = 0;
    long nr;
 
    /*
    * Determine whether and which event to report to ptracer.  When
    * called from kernel_thread or CLONE_UNTRACED is explicitly
    * requested, no event is reported; otherwise, report if the event
    * for the type of forking is enabled.
    */
    if (!(clone_flags & CLONE_UNTRACED)) {
        if (clone_flags & CLONE_VFORK)
            trace = PTRACE_EVENT_VFORK;
        else if ((clone_flags & CSIGNAL) != SIGCHLD)
            trace = PTRACE_EVENT_CLONE;
        else
            trace = PTRACE_EVENT_FORK;
     
        if (likely(!ptrace_event_enabled(current, trace)))
            trace = 0;
    }
     
    p = copy_process(clone_flags, stack_start, stack_size,
        child_tidptr, NULL, trace);
    /*
    * Do this prior waking up the new thread - the thread pointer
    * might get invalid after that point, if the thread exits quickly.
    */
    if (!IS_ERR(p)) {
        struct completion vfork;
        struct pid *pid;
     
        trace_sched_process_fork(current, p);
     
        pid = get_task_pid(p, PIDTYPE_PID);
        nr = pid_vnr(pid);
     
        if (clone_flags & CLONE_PARENT_SETTID)
            put_user(nr, parent_tidptr);
     
        if (clone_flags & CLONE_VFORK) {
            p->vfork_done = &vfork;
            init_completion(&vfork);
            get_task_struct(p);
        }
     
        wake_up_new_task(p);
     
        /* forking complete and child started to run, tell ptracer */
        if (unlikely(trace))
            ptrace_event_pid(trace, pid);
     
        if (clone_flags & CLONE_VFORK) {
            if (!wait_for_vfork_done(p, &vfork))
                ptrace_event_pid(PTRACE_EVENT_VFORK_DONE, pid);
        }
     
        put_pid(pid);
    } else {
        nr = PTR_ERR(p);
    }
    return nr;
 
}

execve函数调用

exec_binprm函数实现为:

static int exec_binprm(struct linux_binprm *bprm)
{
    pid_t old_pid, old_vpid;   
    int ret;
    old_pid = current->pid;
    rcu_read_lock();
    old_vpid = task_pid_nr_ns(current, task_active_pid_ns(current->parent));
    rcu_read_unlock();
    <strong>ret = search_binary_handler(bprm);</strong>
    if (ret >= 0) {
        audit_bprm(bprm);
        trace_sched_process_exec(current, old_pid, bprm);
        ptrace_event(PTRACE_EVENT_EXEC, old_vpid);
        proc_exec_connector(current);
    }
    return ret;
}   

Linux内核的一般执行过程

 

结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程

标签:执行   ike   The   event   进程   its   tac   after   repo   

原文地址:https://www.cnblogs.com/kuanghf/p/13137577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!