是否可以通过 ftrace 或无论如何将内核函数挂钩/回调到我的内核模块。
例如:每次调用我的模块的函数net_tx_action()时,我都想要钩子,包括参数。
问候彼得
您可以在 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 变量可能会有所帮助。