克隆/ fork / vfork之后,父进程和subprocess具有不同的返回地址

我在centos 6.6上工作,并想为post-clone添加一个post-clone钩子。 我已经将syscall_table[__NR_clone]更改为我的函数,在那里我将栈上的返回地址更改为我的syscall_table[__NR_clone]函数,然后将其跳转到实际的系统调用clone以便在实际系统调用之后,程序将返回到我的post-clonefunction。 由于我在实际的clone发生之前更改了堆栈上的返回地址,所以父进程和subprocess都应该具有相同的返回地址。 但是,只有父进程返回到我post-clone ,而subprocess返回到实际的返回地址。 希望有人能帮我弄清楚为什么这样做。

我终于明白为什么clone/fork/vfork之后父进程和子进程有不同的返回地址。 系统调用clone将调用kernel/fork.c copy_process()copy_process()会将current任务结构复制到变量p 。 然后将p传递给copy_thread() ,其中p的指令指针(ip)由entry_32.S (或entry_32.Sentry_64.S )中的汇编函数ret_from_fork分配。 64位版本有所不同,但有相同的想法。

子进程的ip更改为ret_from_fork ,而父进程的ip保持不变。 因此,在系统调用clone/fork/vfork ,父进程和子进程将有不同的返回地址。