Linux内核 – 如何将jprobe与kretprobe相匹配?

Linux内核 – 如何将jprobe与kretprobe相匹配?,第1张

概述我正在编写一个内核模块来监视一些想要在调用成功时将函数参数返回到user-land(通过netlink socket)的系统调用.jprobe.kp.symbol_name = 'rename'; jprobe.entry = rename_handler; kretprobe.kp.symbol_name = 'rename'; kretprobe.ha @H_502_1@我正在编写一个内核模块来监视一些想要在调用成功时将函数参数返回到user-land(通过netlink socket)的系统调用.

@H_502_1@

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;}
@H_502_1@我担心另一个重命名系统调用可以抢占[1] jprobe之后的当前一个,我将发送错误的返回码和参数.

@H_502_1@

jprobe: rename(a,b)    jprobe rename(c,d)    kretprobekretprobe
@H_502_1@编辑:本文[2]指出在kprobe处理程序期间禁用了中断.但这是否意味着整个链中断(jprobe – > kprobe – > kretprobe)或仅针对该单个kprobe禁用中断?

@H_502_1@> https://unix.stackexchange.com/questions/186355/few-questions-about-system-calls-and-kernel-modules-kernel-services-in-parallel
> https://lwn.net/Articles/132196/最佳答案每个jprobe调用都禁用中断:不是整个序列.

@H_502_1@在应用程序处理它们的时候,您期望多少个电话?根据您对调用的预期速度,有不同的方法.最简单的方法,如果您只需要几百个调用就可以处理它们,并且您将静态内存用于此目的,就是实现一个内存中的rename_obj_t对象的静态数组,然后使用来自内核asm的atomic_add指向下一个条目(修改数组的大小).

@H_502_1@这样,每次返回一个唯一的静态引用,只要计数器在处理返回值之前没有回绕. atomic_add保证具有正确的内存屏障,因此您不必担心缓存一致性等问题.

总结

以上是内存溢出为你收集整理的Linux内核 – 如何将jprobe与kretprobe相匹配?全部内容,希望文章能够帮你解决Linux内核 – 如何将jprobe与kretprobe相匹配?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1050129.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存