【问题标题】:How can the ftrace support hook functionftrace如何支持hook功能
【发布时间】:2017-11-26 12:26:23
【问题描述】:

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

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

问候 彼得

【问题讨论】:

标签: kernel ftrace


【解决方案1】:

您可以在 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)。

Here's a working example with the code. 它应该适用于非 IRQ 函数。可以从中断上下文调用的函数比较棘手,因为没有将函数激活与关联的特定任务。我还没有针对这种情况的强大解决方案。如果在执行过程中不能将中断处理程序重新调度到另一个 CPU,那么每个 CPU 变量可能会有所帮助。

【讨论】:

  • 实际上,我有一个使用parent_ip 参数的想法,该参数传递给 ftrace 回调函数。它可用于根据模块地址范围清除钩子函数所做的原始调用。这应该允许对 IRQ 函数进行适当的递归调用和挂钩。我试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 2015-06-14
  • 2013-10-12
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多