首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux -如何将j探针与kret探头相匹配?

Linux -如何将j探针与kret探头相匹配?
EN

Stack Overflow用户
提问于 2016-10-03 14:35:41
回答 1查看 628关注 0票数 7

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

代码语言:javascript
复制
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;
}

我担心另一个重命名的syscall可能会在j探针之后出现当前的preempt1,并且我会发送不正确的返回代码和参数。

代码语言:javascript
复制
jprobe: rename(a, b)
    jprobe rename(c, d)
    kretprobe
kretprobe

编辑:此article2声明中断在k探针处理程序期间被禁用。但是,这是否意味着中断在整个链中是禁用的(j探针、->、->、kret探头),还是仅用于单个k探头?

  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/
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-13 16:49:00

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

在处理应用程序所需的时间内,您期望调用多少次?根据您期望调用的速度不同,有不同的方法。最简单的方法是实现内存中的rename_obj_t对象的静态数组,然后使用内核and中的atomic_add指向下一个条目(mod数组的数组大小)。

这样,每次都返回一个唯一的静态引用,只要计数器在处理返回的值之前不进行包装。atomic_add保证有正确的内存屏障,这样您就不必担心缓存一致性之类的问题了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39834162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档