【问题标题】:After clone/fork/vfork, parent and child processes have different return addressesclone/fork/vfork后,父子进程返回地址不同
【发布时间】:2015-10-28 17:11:19
【问题描述】:

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

【问题讨论】:

  • 这个话题很有趣,你介意添加一些代码sn-ps吗?
  • @tlwhitec,对不起,我没有代码了。但它只是使用了基本的系统调用拦截技术,即将系统调用表中的系统调用指针更改为linux内核模块中定义的函数。

标签: linux centos fork system-calls callstack


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 2021-11-05
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多