我在centos 6.6上工作,并希望为post-clone
添加clone
挂钩。我已将syscall_table[__NR_clone]
更改为我的函数,我将堆栈上的返回地址更改为post-clone
函数,然后将其跳转到实际的clone
系统调用,以便在实际之后系统调用,程序将返回我的post-clone
函数。由于我在实际clone
发生之前更改了堆栈上的返回地址,因此父进程和子进程都应该具有相同的返回地址。但是,只有父进程返回到我的post-clone
,而子进程返回到实际的返回地址。希望有人能帮助我弄清楚它为什么会这样。
答案 0 :(得分:1)
我终于弄清楚为什么父进程和子进程在clone/fork/vfork
之后有不同的返回地址。系统调用clone
将在copy_process()
中调用kernel/fork.c
。 copy_process()
会将current
任务结构复制到变量p
。然后将p
传递给copy_thread()
,其中p
的指令指针(ip)由ret_from_fork
分配,entry.S
是entry_32.S
中的汇编函数(或entry_64.S
或ret_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);
之后,父进程和子进程将具有不同的返回地址。