fork系统调用后,较低级别会发生什么?

fork系统调用后,较低级别会发生什么?,fork,system-calls,Fork,System Calls,我知道fork()在更高级别上的作用。我想知道的是- 一旦有一个fork调用,一个trap指令就会跟着执行,控制跳转以执行fork“handler”。现在,这个创建子进程的处理程序如何通过创建另一个地址空间和进程控制块来复制父进程,并向每个进程返回2个值 fork在什么执行点返回2个值 简而言之,anbody能否解释在fork调用后在较低级别发生的逐步事件?这并不难,对吧?fork()系统调用的内核部分可以通过您提到的进程控制块来区分这两个进程,但您甚至不需要这样做。所以伪代码看起来像: int

我知道fork()在更高级别上的作用。我想知道的是-

  • 一旦有一个fork调用,一个trap指令就会跟着执行,控制跳转以执行fork“handler”。现在,这个创建子进程的处理程序如何通过创建另一个地址空间和进程控制块来复制父进程,并向每个进程返回2个值

  • fork在什么执行点返回2个值


  • 简而言之,anbody能否解释在fork调用后在较低级别发生的逐步事件?

    这并不难,对吧?fork()系统调用的内核部分可以通过您提到的进程控制块来区分这两个进程,但您甚至不需要这样做。所以伪代码看起来像:

    int fork()
    {
        int orig_pid = getpid();
    
        int new_pid = kernel_do_fork();     // Now there's two processes
    
        // Remember, orig_pid is the same in both procs
        if (orig_pid == getpid()) {
            return new_pid;
        }
    
        // Must be the child
        return 0;
    }
    
    编辑: naive版本的功能与您描述的一样—它创建一个新的进程上下文,复制所有关联的线程上下文,复制所有页面和文件映射,并将新进程放入“准备运行”列表中


    我认为你所困惑的部分是,当这些进程恢复时(即当父代从Kelnel-doyFook返回,并且孩子第一次被调度)时,它开始在函数的中间(即执行第一个‘IF’)。这是一个精确的拷贝-两个进程都将执行函数的后半部分

    返回到每个进程的值是不同的。父线程/原始线程get是子进程的PID,子进程get是0


    Linux内核在x86上通过更改eax寄存器中的值来实现这一点,就像它在父进程中一样。

    请告诉我什么是内核\u do\u fork()?这不是在反复地说吗?谢谢你花时间解释保罗。