Я работаю на centos 6.6 и хочу добавить крючок post-clone
для clone
. Я изменил syscall_table[__NR_clone]
на мою функцию, где я меняю адрес возврата в стеке на свою функцию post-clone
, а затем перехожу в реальный clone
syscall, так что после фактического syscall программа вернется к моей функции post-clone
. Поскольку я меняю адрес возврата в стек до фактического clone
, оба родительского и дочернего процессов должны иметь одинаковый адрес возврата. Однако только родительский процесс возвращается обратно к моему post-clone
, а дочерний процесс возвращается к фактическому адресу возврата. Надеюсь, кто-то может помочь мне понять, почему он так себя ведет.После того, как клон/вилка/vfork родительский и дочерний процессы имеют разные обратные адреса
2
A
ответ
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
родительский и дочерний процессы будут иметь разные обратные адреса.
Это очень интересный топик, не могли бы вы добавить некоторые фрагменты кода? – tlwhitec
@tlwhitec, извините, у меня больше нет кода. Но он просто использует метод перехвата базового системного вызова, который меняет указатель syscall в таблице системных вызовов на функцию, определенную в модуле ядра Linux. – ruofan