我正在编写一个内核模块来监视一些想要在调用成功时将函数参数返回到user-land(通过netlink socket)的系统调用.
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;
}
我担心另一个重命名系统调用可以抢占[1] jprobe之后的当前一个,我将发送错误的返回码和参数.
jprobe: rename(a,b)
jprobe rename(c,d)
kretprobe
kretprobe
编辑:本文[2]指出在kprobe处理程序期间禁用了中断.但这是否意味着整个链中断(jprobe – > kprobe – > kretprobe)或仅针对该单个kprobe禁用中断?
> https://unix.stackexchange.com/questions/186355/few-questions-about-system-calls-and-kernel-modules-kernel-services-in-parallel
> https://lwn.net/Articles/132196/
最佳答案