本文共 2216 字,大约阅读时间需要 7 分钟。
vfork 共享内存描述符和所有的页表。fork除指定SIGCHLD信号以及所有清0的clone标志。
fork clone 都是c语言定义的一直封装函数,只有do_fork 才是内核态函数。
do_fork copy_process 执行流程和调用关系总结。
do_fork->copy_process->
核心代码
static struct task_struct *copy_process(unsigned long clone_flags,
unsigned long stack_start, struct pt_regs *regs, unsigned long stack_size, int __user *child_tidptr, struct pid *pid, int trace) {。。。。。。 以下函数需要在设置相应的CLONE_*标志才会被执行。
if ((retval = audit_alloc(p))) goto bad_fork_cleanup_policy; /* copy all the process information */ if ((retval = copy_semundo(clone_flags, p))) goto bad_fork_cleanup_audit; if ((retval = copy_files(clone_flags, p))) goto bad_fork_cleanup_semundo; if ((retval = copy_fs(clone_flags, p))) goto bad_fork_cleanup_files; if ((retval = copy_sighand(clone_flags, p))) goto bad_fork_cleanup_fs; if ((retval = copy_signal(clone_flags, p))) goto bad_fork_cleanup_sighand; if ((retval = copy_mm(clone_flags, p))) goto bad_fork_cleanup_signal; if ((retval = copy_namespaces(clone_flags, p))) goto bad_fork_cleanup_mm; if ((retval = copy_io(clone_flags, p))) goto bad_fork_cleanup_namespaces; retval = copy_thread(clone_flags, stack_start, stack_size, p, regs); if (retval) goto bad_fork_cleanup_io;
。。。。。。
}
系统调用代码:
2.6.32代码
int sys_fork(unsigned long p1, unsigned long p2, unsigned long p3,
unsigned long p4, unsigned long p5, unsigned long p6, struct pt_regs *regs) { CHECK_FULL_REGS(regs); return do_fork(SIGCHLD, regs->gpr[1], regs, 0, NULL, NULL); } int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3, unsigned long p4, unsigned long p5, unsigned long p6, struct pt_regs *regs) { CHECK_FULL_REGS(regs); return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->gpr[1], regs, 0, NULL, NULL); }int sys_clone(unsigned long clone_flags, unsigned long usp,
int __user *parent_tidp, void __user *child_threadptr, int __user *child_tidp, int p6, struct pt_regs *regs) { CHECK_FULL_REGS(regs); if (usp == 0) usp = regs->gpr[1];/* stack pointer for child */ #ifdef CONFIG_PPC64 if (test_thread_flag(TIF_32BIT)) { parent_tidp = TRUNC_PTR(parent_tidp); child_tidp = TRUNC_PTR(child_tidp); } #endif return do_fork(clone_flags, usp, regs, 0, parent_tidp, child_tidp); }参考资料:
http://blog.sina.com.cn/s/blog_6abf2c040101fpcb.html
转载地址:http://ktloi.baihongyu.com/