吴忠躺衫网络科技有限公司

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

    文章

    595

    瀏覽量

    27510
  • 分配器
    +關注

    關注

    0

    文章

    195

    瀏覽量

    25832
  • CAS
    CAS
    +關注

    關注

    0

    文章

    35

    瀏覽量

    15235
  • Hash算法
    +關注

    關注

    0

    文章

    43

    瀏覽量

    7417

原文標題: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 ?935次閱讀
    你知道<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 ?2910次閱讀

    深入探究Linux中的Kprobe機制

    概述 kprobe機制用于在內核中動態添加一些探測點,可以滿足一些調試需求。本文主要探尋kprobe的執行路徑,也就是說如何trap到kprobe,以及如何回到原路徑繼續執行。 實例
    的頭像 發表于 01-02 11:53 ?2621次閱讀

    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 ?1946次閱讀
    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.5w次閱讀
    接地基礎知識:PE 和 FG <b class='flag-5'>有</b><b class='flag-5'>何</b><b class='flag-5'>區別</b>?

    淺談Linux kernel中的同步機制

    同步就是進程與進程之間,進程與系統資源之間的交互。由于 Linux內核采用的是多任務,所以在多個進程之間,必須要有同步機制來保證彼此協調。
    的頭像 發表于 05-04 17:06 ?976次閱讀

    likely與unlikely在Linux kernel區別

    likely() 與 unlikely() 在 Linux kernel 中隨處可見,那為什么要用它們?它們之間什么區別呢? 首先明確: if (likely(value)) 等價于
    的頭像 發表于 07-20 11:06 ?1110次閱讀

    異構集成 (HI) 與系統級芯片 (SoC) 區別

    異構集成 (HI) 與系統級芯片 (SoC) 區別
    的頭像 發表于 11-29 15:39 ?2489次閱讀
    異構集成 (HI) 與系統級芯片 (SoC) <b class='flag-5'>有</b><b class='flag-5'>何</b><b class='flag-5'>區別</b>?

    光耦與光繼電器區別

    光耦與光繼電器區別
    的頭像 發表于 12-13 13:59 ?978次閱讀
    光耦與光繼電器<b class='flag-5'>有</b><b class='flag-5'>何</b><b class='flag-5'>區別</b>?
    二八杠技巧培训| 百家乐官网视频游戏账号| 玩百家乐官网有何技巧| 立即博百家乐的玩法技巧和规则 | 大发888海立方| 真人百家乐官网大转轮| 百家乐77scs| 澳门百家乐官网海星王娱乐城 | 百家乐官网交流群号| 百家乐视频游戏会员| 百乐彩博彩| 百家乐庄闲机率| 尊龙线上娱乐| 24是吉还是凶| 岗巴县| 百家乐投注怎么样| 百家乐官网园胎教网| 打百家乐庄闲的技巧| 百家乐官网怎么稳赚| 豪华百家乐桌子| 金冠百家乐官网娱乐城| 伯爵百家乐的玩法技巧和规则| 百家乐官网投注平台信誉排行| 威尼斯人娱乐城介| 百家乐官网是怎样算牌| 德州扑克怎么分钱| 百家乐官网桌子租| 新皇冠娱乐城| 至尊百家乐下载| 精英百家乐官网现金网| 狮威百家乐娱乐网| 赌博百家乐官网有技巧吗| 大发888怎么找| 八卦图24山代表的| 潢川县| 百家乐洗码软件| 石楼县| 富二代百家乐的玩法技巧和规则| 致胜百家乐官网软件| 真钱百家乐赌博| 利博百家乐破解|