內核ftrace的實現

在動態(tài)ftrace原理中已經介紹了內核通過gcc -pg -fentry為函數增加5 Byte的stub罚舱,系統(tǒng)啟動后這5 Byte被修改為NOP指令:66 66 66 66 90H。

開始trace時要將NOP指令修改為跳轉指令绎谦,去執(zhí)行各種trace對應的hook函數管闷。function trace對應的hook函數就是function_trace_call。

本文將會介紹內核是如何修改代碼段以控制函數去執(zhí)行指定的hook函數窃肠。

運行時修改代碼段

系統(tǒng)運行時修改代碼段是一個很危險的操作包个,因為被修改的5 Byte有可能跨兩個cache line,如果其它Core正在執(zhí)行铭拧,有可能取到被修改了一半的結果赃蛛,導致系統(tǒng)crash。

ftrace修改代碼段是在ftrace_replace_code中完成的搀菩,這個函數里有三個大循環(huán)

  • add_breakpoints: 首先找到需要trace的函數呕臂,將第一個字節(jié)修改為0xCC,即int 3(也叫break指令)
  • add_update: 修改為callq trampoline指令肪跋,但是第一個字節(jié)保留為0xCC
  • finish_update: 將0xCC修改為0xE8歧蒋,即為call指令
# echo expand_files > set_ftrace_filter
# echo function > current_tracer 

以上面的操作舉例,配置ftrace跟蹤expand_files函數州既,該函數前5 Byte變化如下面所示:

0xffffffff8114aae0 <expand_files>: 
66 66 66 66 90H        <-- NOP
    |
    |
    V
CC 66 66 66 90H        <-- int 3
    |
    |
    V
CC 1b 55 eb 1eH        <-- 跳轉的偏移已經修改好了谜洽,但opcode還是int 3
    |
    |
    V
e8 1b 55 eb 1eH        <-- callq  0xffffffffa0000000

內核在修改代碼段時先將第一個Byte修改為0xCC,如果有其它Core執(zhí)行到這里會觸發(fā)異常吴叶,但是在int 3異常處理程序中直接返回并再次觸發(fā)異常阐虚,直至int 3被修改為call指令后才跳出循環(huán)

dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
{
#ifdef CONFIG_DYNAMIC_FTRACE
    /*
     * ftrace must be first, everything else may cause a recursive crash.
     * See note by declaration of modifying_ftrace_code in ftrace.c
     */
    if (unlikely(atomic_read(&modifying_ftrace_code)) &&
        ftrace_int3_handler(regs))
        return;
#endif
    
    ...

跳轉目標

前面說到trace的原理是修改函數開始的5 Byte,讓其先去執(zhí)行指定的hook函數蚌卤。不同的tracer有不同的hook函數实束,function tracer的hook函數是function_trace_call奥秆,這個函數的功能比較簡單,只是向ring buffer中記錄了ip和parent_ip

內核提供了<font color=cornflowerblue>.ftrace_caller</font>和<font color=cornflowerblue>.ftrace_regs_caller</font>兩段匯編代碼作為wrapper咸灿,用來完成保存/恢復寄存器等通用的工作疫向,其中的<font color=cornflowerblue>call ftrace_stub</font >會被修改為各種tracer對應的hook function

ENTRY(ftrace_caller)
    /* save_mcount_regs fills in first two parameters */
    save_mcount_regs

GLOBAL(ftrace_caller_op_ptr)
    /* Load the ftrace_ops into the 3rd parameter */
    movq function_trace_op(%rip), %rdx

    /* regs go into 4th parameter (but make it NULL) */
    movq $0, %rcx

GLOBAL(ftrace_call)
    call ftrace_stub

    restore_mcount_regs

GLOBAL(ftrace_caller_end)

GLOBAL(ftrace_return)

#ifdef CONFIG_FUNCTION_GRAPH_TRACER
GLOBAL(ftrace_graph_call)
    jmp ftrace_stub
#endif

GLOBAL(ftrace_stub)
    retq
END(ftrace_caller)

但是內核也沒有直接調用<font color=cornflowerblue>.ftrace_caller</font>和<font color=cornflowerblue>.ftrace_regs_caller</font>纬凤,而是在內存中構造了一個trampoline嚎花,將<font color=cornflowerblue>.ftrace_caller</font>拷貝到這段trampoline中龟再,并修改其中的相對偏移。

多個tracer同時工作

未完待續(xù)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末审胸,一起剝皮案震驚了整個濱河市亥宿,隨后出現的幾起案子,更是在濱河造成了極大的恐慌歹嘹,老刑警劉巖箩绍,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異尺上,居然都是意外死亡材蛛,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門怎抛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卑吭,“玉大人,你說我怎么就攤上這事马绝《股停” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵富稻,是天一觀的道長掷邦。 經常有香客問我,道長椭赋,這世上最難降的妖魔是什么抚岗? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮哪怔,結果婚禮上宣蔚,老公的妹妹穿的比我還像新娘。我一直安慰自己认境,他們只是感情好胚委,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叉信,像睡著了一般亩冬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硼身,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天鉴未,我揣著相機與錄音枢冤,去河邊找鬼。 笑死铜秆,一個胖子當著我的面吹牛,可吹牛的內容都是我干的讶迁。 我是一名探鬼主播连茧,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巍糯!你這毒婦竟也來了啸驯?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祟峦,失蹤者是張志新(化名)和其女友劉穎罚斗,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體宅楞,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡针姿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了厌衙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片距淫。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖婶希,靈堂內的尸體忽然破棺而出榕暇,到底是詐尸還是另有隱情,我是刑警寧澤喻杈,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布彤枢,位于F島的核電站,受9級特大地震影響筒饰,放射性物質發(fā)生泄漏缴啡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一龄砰、第九天 我趴在偏房一處隱蔽的房頂上張望盟猖。 院中可真熱鬧,春花似錦换棚、人聲如沸式镐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娘汞。三九已至,卻和暖如春夕玩,著一層夾襖步出監(jiān)牢的瞬間你弦,已是汗流浹背惊豺。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禽作,地道東北人尸昧。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像旷偿,于是被迫代替她去往敵國和親烹俗。 傳聞我的和親對象是個殘疾皇子萍程,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容