[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
chengshiding 于 2011-11-28 00:02:23发表:
4# HS_217^_^
好复杂 不知道要说明什么
HS_217^_^ 于 2011-11-26 23:05:56发表:
3# chengshiding
(o):tx
在书上,我看明白了。
为了防止父进程修改子进程需要的数据,阻塞父进程的执行,一直到子进程退出或执行一个新的程序为止。
传统的fork()会使父进程和子进程暂时共享同一个用户态堆栈,但一般情况下,写时复制进制会在父子进
程中有一个试图去改变栈是,立即各自得到用户态堆栈的一份拷贝。
从内核空间创建进程将导致没有写时复制!!!直到执行一个execve调用。这对堆栈可能带来了问题。处
理的方法是在fork()调用后不让main()使用任何堆栈。因此就不会有函数调用。--
事实上只有pause和fork需要使用inline(可以避免如参数传递的堆栈操作),从而保证main()不会弄乱堆栈。
这是我最近的理解。(so):)
chengshiding 于 2011-11-25 18:42:34发表:
inline是内联的意思(c++里的东东)。 fork是创建进程的系统调用。
好象是说 在这里的代码要以inline的方式(在一个main函数里面),即不是调用子函数。目的是不想使用栈。这样,就不会出现NO COPY ON WRITE(新技术"写时才复制"用不上,效率差)。
最后说,调用子函数和创建子进程都要使用inline的方式。
哈哈 开始研究源代码了呀 了不起啊。。。
bzbj 于 2011-11-25 08:46:44发表:
帮顶下