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

    文章

    567

    浏览量

    26911
  • 分配器
    +关注

    关注

    0

    文章

    176

    浏览量

    25293
  • CAS
    CAS
    +关注

    关注

    0

    文章

    34

    浏览量

    15007
  • Hash算法
    +关注

    关注

    0

    文章

    43

    浏览量

    7362

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

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

收藏 人收藏

    评论

    相关推荐

    linux kernel

    linux kernel 什么学习技巧吗?
    发表于 06-11 18:23

    说说android与linux区别

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

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

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

    Linux c/c++服务器开发和嵌入式软件工程师区别

    Linux c/c++服务器开发和嵌入式软件工程师区别
    发表于 12-24 08:02

    请问D1平台tina的kernel和标准的5.4kernel哪些区别?改动大吗?

    请问D1平台tina的kernel和标准的5.4kernel哪些区别?改动大吗?
    发表于 12-28 07:12

    MS51保护机制的时效访问方式作用

    MS51保护机制功能呢?MS51保护机制的时效访问方式作用?
    发表于 02-11 06:41

    Linuxkernel_timer教程

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

    Linux运行期间升级Linux系 统Uboot+kernel+Rootfs

    Linux运行期间升级Linux系 统Uboot+kernel+Rootfs
    发表于 10-30 08:43 5次下载
    在<b class='flag-5'>Linux</b>运行期间升级<b class='flag-5'>Linux</b>系 统Uboot+<b class='flag-5'>kernel</b>+Rootfs

    Linux-kernel-3 0的移植记录

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

    U-boot传递RAM和Linux kernel读取RAM参数的解析

    U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等。而Linux kernel也会读取和处理这些参数。两者之间通过struct tag来传递参数。
    的头像 发表于 02-06 08:24 5610次阅读
    U-boot传递RAM和<b class='flag-5'>Linux</b> <b class='flag-5'>kernel</b>读取RAM参数的解析

    Linux Kernel 5.2.2震撼发布!

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

    深入探究Linux中的Kprobe机制

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

    Linux_Kernel_Developments内核开发

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

    Linux Kernel5.10维护周期将从2年延长至6年

    经过 Linux Kernel 社区成员的共同努力,Linux Kernel 5.10 维护周期最终确定从2年延长至6年。华为是第一个在 Linux
    的头像 发表于 05-24 13:52 2122次阅读

    likely与unlikely在Linux kernel区别

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