Linux内核 – 如何匹配jprobe到kretprobe?

我正在编写一个内核模块来监视一些系统调用,如果调用成功的话,我们希望将函数参数返回给用户(通过netlink套接字)。

jprobe.kp.symbol_name = "rename"; jprobe.entry = rename_handler; kretprobe.kp.symbol_name = "rename"; kretprobe.handler = rename_ret_handler; static rename_obj_t _g_cur_rename = NULL; static void _rename_handler(const char *oldpath, const char *newpath) { _g_cur_rename = create_rename(oldpath, newpath); jprobe_return(); } static void _rename_ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs) { /* Send only if successful */ if (regs_return_value(regs) == 0) { add_send_queue(_g_cur_rename); } return 0; } 

我担心另一个重命名系统调用可能会抢先jprobe之后的当前一个,我将发送不正确的返回码和参数。

 jprobe: rename(a, b) jprobe rename(c, d) kretprobe kretprobe 

编辑:这篇文章[2]指出中断在kprobe处理程序中被禁用。 但是这是否意味着整个链(jprobe – > kprobe – > kretprobe)中的中断是禁用的,还是仅仅针对该单个kprobe?

  1. https://unix.stackexchange.com/questions/186355/few-questions-about-system-calls-and-kernel-modules-kernel-services-in-parallel
  2. https://lwn.net/Articles/132196/

每个jprobe调用都禁用中断,而不是整个序列。

你需要多少个电话来处理它们? 根据你预期的呼叫速度有多快,有不同的方法。最简单的方法,如果你只需要几百个呼叫,然后你可以处理它们,你将专用静态内存的目的,是实现一个内存中的rename_obj_t对象的静态数组,然后使用atomic_add从内核asm包括指向下一个条目(mod你的数组的大小)。

这样,每次只返回一个唯一的静态引用,只要计数器在处理返回的值之前不会回绕。 atomic_add被保证有正确的内存屏障,所以你不必担心缓存一致性等问题。