在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    596

    瀏覽量

    27510
  • 分配器
    +關注

    關注

    0

    文章

    195

    瀏覽量

    25833
  • CAS
    CAS
    +關注

    關注

    0

    文章

    35

    瀏覽量

    15236
  • 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 ?2622次閱讀

    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 ?1111次閱讀

    異構集成 (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>?
    主站蜘蛛池模板: 凹厕所xxxxbbbb偷拍视频 | 四虎网址在线观看 | 午夜免费影视 | 午夜性刺激免费视频观看不卡专区 | 久热网| 在线免费黄 | 成人在色线视频在线观看免费大全 | 国产专区青青草原亚洲 | 免费人成在线观看视频播放 | 亚洲综合色一区二区三区小说 | 日日爽夜夜爽 | 国产成人乱码一区二区三区 | 男人的天堂在线视频 | 色香蕉网站| 日产精品卡二卡三卡四卡乱码视频 | video另类蛇交 | 日韩欧美一区二区三区视频 | 亚洲激情视频 | 青娱乐久草 | 狠狠操夜夜爱 | 欧美在线一区二区三区 | 亚洲国产精品日韩专区avtube | 天天插夜夜操 | 香蕉视频黄色片 | 欧美一级一一特黄 | 亚洲视频二 | 又粗又长又大真舒服好爽漫画 | 黄www色 | 亚洲精品国产美女在线观看 | abc欧美成人影院 | 午夜美女网站 | 免费一级特黄视频 | 色五月天天 | 美女黄色毛片免费看 | 上课被同桌摸下面做羞羞 | 国产最好的精华液网站 | 伊人久久大香线蕉综合电影 | 日本久操视频 | 一级片免费看 | 国产在线小视频 | 天天做天天爱天天爽综合网 |