红联Linux门户
Linux帮助

源码中这段话是什么意思?

发布时间:2011-11-24 21:43:26来源:红联作者:HS_217^_^
[code]00011 /*
00012 * we need this inline - forking from kernel space will result
00013 * in NO COPY ON WRITE (!!!), until an execve is executed. This
00014 * is no problem, but for the stack. This is handled by not letting
00015 * main() use the stack at all after fork(). Thus, no function
00016 * calls - which means inline code for fork too, as otherwise we
00017 * would use the stack upon exit from 'fork()'.
00018 *
00019 * Actually only pause and fork are needed inline, so that there
00020 * won't be any messing with the stack from main(), but we define
00021 * some others too.
00022 */
[/code]我自己翻译:
我们需要“inline"--从内核空间fork会导致非写时复制(!!!),一直到一个可执行程序被执行。
如果不是栈,这没有问题。它的处理是通过在fork()后,根本不让main()使用栈。因此,没有函数调用
--也就意味着fork的inline代码,否则我们将在退出出fork()时使用栈。
实际上,只有pause和fork需要inline,所以从main()中不会再有任何关于栈的信息,但是我们
却为其他的定义了栈。

这段话我自己翻译后,不是很明白。什么意思呀?究竟是要解释什么呀?:0D1
文章评论

共有 4 条评论

  1. chengshiding 于 2011-11-28 00:02:23发表:

    4# HS_217^_^

    好复杂 不知道要说明什么

  2. HS_217^_^ 于 2011-11-26 23:05:56发表:

    3# chengshiding
    (o):tx
    在书上,我看明白了。
    为了防止父进程修改子进程需要的数据,阻塞父进程的执行,一直到子进程退出或执行一个新的程序为止。
    传统的fork()会使父进程和子进程暂时共享同一个用户态堆栈,但一般情况下,写时复制进制会在父子进
    程中有一个试图去改变栈是,立即各自得到用户态堆栈的一份拷贝。

    从内核空间创建进程将导致没有写时复制!!!直到执行一个execve调用。这对堆栈可能带来了问题。处
    理的方法是在fork()调用后不让main()使用任何堆栈。因此就不会有函数调用。--
    事实上只有pause和fork需要使用inline(可以避免如参数传递的堆栈操作),从而保证main()不会弄乱堆栈。
    这是我最近的理解。(so):)

  3. chengshiding 于 2011-11-25 18:42:34发表:

    inline是内联的意思(c++里的东东)。 fork是创建进程的系统调用。
    好象是说 在这里的代码要以inline的方式(在一个main函数里面),即不是调用子函数。目的是不想使用栈。这样,就不会出现NO COPY ON WRITE(新技术"写时才复制"用不上,效率差)。
    最后说,调用子函数和创建子进程都要使用inline的方式。

    哈哈 开始研究源代码了呀 了不起啊。。。

  4. bzbj 于 2011-11-25 08:46:44发表:

    帮顶下