一般进程的创建分为两步:fork() + exec()
fork()通过拷贝当前进程创建一个子进程。子进程与父进程的区别仅仅在于PID、PPID和某些资源和统计量。
exec()函数负责读取可执行文件并将其载入地址空间开始运行。
fork(),vfork(),__clone()根据各自需要的参数标志去调用clone()。然后由clone()去调用do_fork()。
当我们要fork()、vfork(),__clone()时,我们要用一个struct pt_regs regs结构保存断点时的信息(即当用户态转到内核态时产生中断),这个结构里放着一系列的寄存器。比如:用 ebx 寄存器保存可执行文件路径的指针,用 ecx 寄存器保存命令行参数的指针,用 edx 寄存器保存环境变量的指针,等等。然后clone()去调用do_fork()。struct pt_regs regs结构如下:
struct pt_regs {
long ebx;
long ecx;
long edx;
long esi;
long edi;
long ebp;
long eax;
int xds;
int xes;
long orig_eax;
long eip;
int xcs;
long eflags;
long esp;
int xss;
};
然后clone()去调用do_fork()。
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,
int __user *ch