在讲进程管理专题最核心的课题——进程创建之前,我们先简单地回顾一下上一篇博文的sys_clone()系统调用:
asmlinkage int sys_clone(struct pt_regs regs)
{
unsigned long clone_flags;
unsigned long newsp;
int __user *parent_tidptr, *child_tidptr;
clone_flags = regs.ebx;
newsp = regs.ecx;
parent_tidptr = (int __user *)regs.edx;
child_tidptr = (int __user *)regs.edi;
if (!newsp)
newsp = regs.esp;
return do_fork(clone_flags, newsp, ®s, 0, parent_tidptr, child_tidptr);
}
那么,在同一个文件中(针对80x86平台是/arch/i386/kernel/Process.c),有:
asmlinkage int sys_fork(struct pt_regs regs)
{
return do_fork(SIGCHLD, regs.esp, ®s, 0, NULL, NULL);
}
asmlinkage int sys_vfork(struct pt_regs regs)
{
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.esp, ®s, 0, NULL, NULL);
}
我们看到,不管是clone、fork还是vfork系统调用,他们的实现函数sys_clone、sys_fork和sys_vfork都指向了位于/kernel/Fork.c中的do_fork函数,唯一的不同就是clone_flags的不同,具体含义请参考前一博文。
这里,我们就来详细分析进程创建的实务函数 —— do_fork()
long do_fork(unsigned long clone_flags,
unsigned long stack_start,
struct pt_regs *regs,
unsigned long stack_size,
int __user *parent_tidptr,
&nb
进程的创建 —— do_fork()函数详解
最新推荐文章于 2022-10-21 11:18:11 发布