0

是否可以通过 ftrace 或无论如何将内核函数挂钩/回调到我的内核模块。

例如:每次调用我的模块的函数net_tx_action()时,我都想要钩子,包括参数。

问候彼得

4

1 回答 1

0

您可以在 ftrace 回调中将 IP 寄存器设置为所需的钩子函数:

static void notrace ftrace_callback(unsigned long ip, unsigned long parent_ip,
                struct ftrace_ops *ops, struct pt_regs *regs)
{
        regs->ip = (unsigned long) hook_function;
}

这将使钩子函数而不是钩子函数执行。钩子函数应该具有与原始函数相同的参数类型和返回值。

您还需要将原始挂钩函数的地址保存在某处,以便您可以从挂钩函数中调用它:

static void (*original_function)(void);

static void hook_function(void)
{
        /* some code before */
        original_function();
        /* some code after */
}

但是,调用原始函数有一个警告:它将再次递归调用 ftrace 回调,因此您需要以某种方式避免在这种情况下重置 IP 寄存器。一种选择是手动跟踪递归(计算函数激活,仅在奇数激活时设置 IP)。

这是一个带有代码的工作示例。它应该适用于非 IRQ 功能。可以从中断上下文中调用的函数比较棘手,因为没有将函数激活与关联的特定任务。我还没有针对这种情况的强大解决方案。如果中断处理程序在执行过程中无法重新调度到另一个 CPU,那么每个 CPU 变量可能会有所帮助。

于 2018-04-19T23:41:36.337 回答