0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux kernel的kretprobe机制和kprobe有何区别?

Linux阅码场 来源:Linux阅码场 2023-08-07 09:15 次阅读

Linux kernel 的 kretprobe 机制和 kprobe 完全不同,本质原因在于,函数的入口地址是固定的,但函数的返回地址不固定,由于返回位置不固定,无法固定函数大小,无法事先插桩。一图以示之:

0b02694e-34bc-11ee-9e74-dac502259ad0.png

想在函数返回时插入个 hook,只有在函数被调用时确定了函数返回地址(x86 为例,压栈返回地址)后才可能。

因此,kprobe 在register 时即可将 hook 挂载,与 kprobe 不同,kretprobe 需在函数每次被调用时才能将 hook 挂载。这只是事情的轮廓,“在函数调用时挂载 hook” 才是大头。

task 将函数返回地址替换成 kretprobe 的 hook 地址之前要保存旧返回地址,由于函数可被不同task 同时调用,因此不同 task 需拥有独立的 kretprobe instance。

同一个 kretprobe hook,不同 kretprobe instance,Linux kernel 预分配了若干(与 CPU 数量相关) kretprobe instance,挂接在 kretprobe 的某 list 上,每当有 task 需要 kretprobe 特定函数时,在函数的入口处先从 kretprobe 的 list 上摘出一 kretprobe instance 供自己私用,此时函数返回地址已经压栈,替换返地址为 hook 前将其 save 在独享的 kretprobe instance 中。

很长一段时间跨越很多内核版本,多个 kretprobe instance 以 hlist node 的方式挂接在以 task地址 hash 为 key 的 hlist 上,而对 hlist node 的 CURD 必然涉及 lock,对于高频调用的热点函数,kretprobe 里的这个lock 相当于自设的路障hash 到同一个 bucket 的 task 同时调用一个函数时会被串行化,严重影响性能,甚至使系统 soft/hard lockup。这是一个知道的人很少的秘密。

为什么不用 percpu lock? 因为函数调用返回前可能发生 task 迁移

后来,那些煤炭奈儿(maintainer,妹忒讷儿估计也发现了问题,提交了一些派驰(patch),将hlist 改成了 CAS-based lock-free free list, 但人家自己也说了 Not the fastest thing in theworld under heavy contention, but simple and correct,详见源文件

上面这些话,请自行比较不同内核版本的 pre handler kretprobe 函数实现。该函数的注释是:This kprobe pre handler is registered with every kretprobe. When probe hits it will set upthe return probe.

so?

别张口就来,挂 kretprobe 的前提是你理解它的副作用,而不是只知道个词,特别是那些上了ebpf 毒瘾的。

我讨厌一些脱离一线很久却又要彰显自己懂得很多而对工人精确指点的经理,这些经理只给出一祈使句指导,代码脚本还是工人照着经理意思去写,经理彰显才华后,事了拂衣去。

经理知道 kretprobe 可以修改函数返回值,但他大概不知道 kretprobe 隐藏的秘密。知道这些秘密的经理不会指使工人用 kretprobe 修改返回值。经理就好好当经理,做好资源和人力的分配调度,别天天混进工人队伍里瞎指挥,还美其名日技术导向,这就是扯淡。

kretprobe 的理论解法是将 return address 也固定,因此理论上可以截获 ret 指令,进入一个common stub hook 中判定该函数是不是需要被 hook,如果不需要这就返回,如果需要就先调用 hook 再返回,但依然会引入别的开销,那么可以缩小替换范围,只在 kretprobe function 附近搜索并替换 ret 指令。

工人提出用 kretprobe 修改 init cwnd,经理会说这是非标的方案,kprobe/kretprobe 更多只做 debug 和可观测性,不能上线...但工人想修改 nit cwnd 却没方案时,经理会让工人用kretprobe 来改,绝口不提是否非标。经理知道 kprobe/kretprobe,但并不真懂,仅科普水平,或做过 demo,但也仅此。对技术细节非常感兴趣又亲自指挥细节的经理不是合格经理。但不知何时,不知为什么,工人们普遍觉得懂技术的经理才合格,于是经理们不得不去懂点技术,显得很 geek,这样才是真经理。很多经理都会此地无银三百两式地强调自己写过代码,懂技术,可也没人问啊。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux系统
    +关注

    关注

    4

    文章

    591

    浏览量

    27344
  • 分配器
    +关注

    关注

    0

    文章

    193

    浏览量

    25724
  • CAS
    CAS
    +关注

    关注

    0

    文章

    34

    浏览量

    15182
  • Hash算法
    +关注

    关注

    0

    文章

    43

    浏览量

    7379

原文标题:kprobe 和 kretprobe 隐藏的秘密

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    说说android与linux区别

    就是靠着linux 才发展起来的,现在来说说区别吧。嵌入式android源码架构:uboot+linux kernel+android(
    发表于 11-04 07:53

    STM32单片机与LINUX操作系统区别

    STM32与LINUX分别是什么?STM32与LINUX区别
    发表于 12-15 06:20

    Linuxkernel_timer教程

    Linuxkernel_timer教程,很好的Linux自学资料,快来学习吧。
    发表于 04-15 17:59 12次下载

    DVR和NVR区别 谁将最终占领市场?

    DVR和NVR区别 谁将最终占领市场?
    发表于 12-27 22:19 0次下载

    Linux-kernel-3 0的移植记录

    Linux-kernel-3 0的移植记录
    发表于 10-31 11:33 7次下载
    <b class='flag-5'>Linux-kernel</b>-3 0的移植记录

    你知道linux kernel内存回收机制是怎样的?

    无论计算机上有多少内存都是不够的,因而linux kernel需要回收一些很少使用的内存页面来保证系统持续内存使用。页面回收的方式页回写、页交换和页丢弃三种方式:如果一个很少使用的
    发表于 05-10 11:37 904次阅读
    你知道<b class='flag-5'>linux</b> <b class='flag-5'>kernel</b>内存回收<b class='flag-5'>机制</b>是怎样的?

    Linux Kernel 5.2.2震撼发布!

    在首个维护版本更新之后,在kernel.org官网上已经将Linux Kernel 5.2分支标记为“Stable”,意味着已经准备好大规模部署了,所有GNU/Linux发行版本都应该
    的头像 发表于 08-09 17:01 2851次阅读

    深入探究Linux中的Kprobe机制

    概述 kprobe机制用于在内核中动态添加一些探测点,可以满足一些调试需求。本文主要探寻kprobe的执行路径,也就是说如何trap到kprobe,以及如何回到原路径继续执行。 实例
    的头像 发表于 01-02 11:53 2542次阅读

    Linux_Kernel_Developments内核开发

    Linux_Kernel_Developments内核开发详细说明。
    发表于 04-07 14:27 37次下载
    <b class='flag-5'>Linux_Kernel</b>_Developments内核开发

    ZigBee 与 Z-Wave:区别

    ZigBee 与 Z-Wave:区别
    的头像 发表于 01-03 09:45 1793次阅读
    ZigBee 与 Z-Wave:<b class='flag-5'>有</b><b class='flag-5'>何</b><b class='flag-5'>区别</b>?

    接地基础知识:PE 和 FG 区别

    接地基础知识:PE 和 FG 区别
    的头像 发表于 03-10 15:07 1.3w次阅读
    接地基础知识:PE 和 FG <b class='flag-5'>有</b><b class='flag-5'>何</b><b class='flag-5'>区别</b>?

    浅谈Linux kernel中的同步机制

    同步就是进程与进程之间,进程与系统资源之间的交互。由于 Linux内核采用的是多任务,所以在多个进程之间,必须要有同步机制来保证彼此协调。
    的头像 发表于 05-04 17:06 865次阅读

    likely与unlikely在Linux kernel区别

    likely() 与 unlikely() 在 Linux kernel 中随处可见,那为什么要用它们?它们之间什么区别呢? 首先明确: if (likely(value)) 等价于
    的头像 发表于 07-20 11:06 1003次阅读

    异构集成 (HI) 与系统级芯片 (SoC) 区别

    异构集成 (HI) 与系统级芯片 (SoC) 区别
    的头像 发表于 11-29 15:39 1981次阅读
    异构集成 (HI) 与系统级芯片 (SoC) <b class='flag-5'>有</b><b class='flag-5'>何</b><b class='flag-5'>区别</b>?

    光耦与光继电器区别

    光耦与光继电器区别
    的头像 发表于 12-13 13:59 825次阅读
    光耦与光继电器<b class='flag-5'>有</b><b class='flag-5'>何</b><b class='flag-5'>区别</b>?