Поскольку вы действительно пытаетесь заменить системный вызов своей собственной функцией, я бы порекомендовал использовать для этой работы kprobes, вы можете легко разбить любой адрес ядра (или символ (например, sys_exit, sys_whateversyscall) и изменить путь выполнения, все это во время выполнения, с модулем ядра, если вам нужно :) У него очень низкие накладные расходы.
Kprobes (или jprobes, если вы только добавляете свой код в системный вызов, а не полностью его заменяете), работают путем динамической замены инструкции (например, первой инструкции вашей записи в системном вызове) на разрыв (например, int3 на x86). Внутри обработчика do_int3 уведомитель уведомляет kprobes, который, в свою очередь, передает выполнение вашей зарегистрированной функции, после чего вы можете делать почти все.
Очень хорошая документация приведена в Documentation / kprobes.txt, например, в качестве крошечного примера в samples / kprobes / kprobes_example.c (в этом примере они ломаются в do_fork для регистрации каждого форка в системе). Он имеет очень простой API и в настоящее время очень переносим.