2015-08-05 7 views
2

Я работаю на centos 6.6 и хочу добавить крючок post-clone для clone. Я изменил syscall_table[__NR_clone] на мою функцию, где я меняю адрес возврата в стеке на свою функцию post-clone, а затем перехожу в реальный clone syscall, так что после фактического syscall программа вернется к моей функции post-clone. Поскольку я меняю адрес возврата в стек до фактического clone, оба родительского и дочернего процессов должны иметь одинаковый адрес возврата. Однако только родительский процесс возвращается обратно к моему post-clone, а дочерний процесс возвращается к фактическому адресу возврата. Надеюсь, кто-то может помочь мне понять, почему он так себя ведет.После того, как клон/вилка/vfork родительский и дочерний процессы имеют разные обратные адреса

+0

Это очень интересный топик, не могли бы вы добавить некоторые фрагменты кода? – tlwhitec

+1

@tlwhitec, извините, у меня больше нет кода. Но он просто использует метод перехвата базового системного вызова, который меняет указатель syscall в таблице системных вызовов на функцию, определенную в модуле ядра Linux. – ruofan

ответ

1

Я наконец понял, почему родительский процесс и дочерний процесс имеют разные обратные адреса после clone/fork/vfork. Системный вызов clone будет вызывать copy_process() в kernel/fork.c. copy_process() будет дублировать структуру задачи current переменной p. Затем p передается copy_thread(), где указатель инструкции (ip) p назначен ret_from_fork, который является функцией сборки в entry.S (или entry_32.S или entry_64.S). 64-битная версия немного отличается, но имеет ту же идею.

IP-адрес дочернего процесса заменен на ret_from_fork, в то время как IP-адрес родительского процесса остается тем же. Поэтому после системного вызова clone/fork/vfork родительский и дочерний процессы будут иметь разные обратные адреса.