在clone / fork / vfork之后,父进程和子进程具有不同的返回地址

时间:2015-08-05 19:02:14

标签: linux centos fork system-calls callstack

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

1 个答案:

答案 0 :(得分:1)

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

子进程的ip更改为clone/fork/vfork,而父进程的ip保持不变。因此,在系统调用UIStoryboard storyboard = UIStoryboard.FromName ("SecondStoryboard", null); UIViewController controller = (UIViewController)storyboard.InstantiateViewController ("SecondVC"); controller.ModalTransitionStyle = UIModalTransitionStyle.CrossDissolve; this.PresentViewController (controller, true, null); 之后,父进程和子进程将具有不同的返回地址。