99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux中ftracer用于用戶空間分析

Linux閱碼場 ? 來源:相遇Linux ? 作者:相遇Linux ? 2021-03-10 15:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

gcc4.6 添加了一個編譯選項 -mfentry, 當(dāng)程序編譯之后,程序中的所有函數(shù),除了notrace屬性

#define notrace __attribute__((no_instrument_function))

的函數(shù)頭上都會添加上call __fentry__,占用5個字節(jié),__fentry__函數(shù)在程序中可以自定義, 比如在Linux kernel中被定義為 retq直接返回。

SYM_FUNC_START(__fentry__)

retq

SYM_FUNC_END(__fentry__)

定義成retq的意思是我不想直接使用__fentry__, 其實現(xiàn)也是在內(nèi)核啟動的時候把__fentry__換成了nopl, 然后在需要trace內(nèi)核函數(shù)時,再替換成對應(yīng)的trampoline(中文: 蹦床)。

本篇講解ftrace(function trace)在用戶空間的應(yīng)用。

以下代碼來自此git工程:

https://github.com/x-lugoo/ftracer.git

ftracer.c中對__fentry__函數(shù)進行了自定義:

ftracer.c

asm(

“ .globl __fentry__

“__fentry__:

/* save arguments */

“ push %rax

“ push %rdi

“ push %rsi

“ push %rdx

“ push %rcx

“ push %r8

“ push %r9

“ movq %rsp,%rdi

“ call ftracer

“ pop %r9

“ pop %r8

“ pop %rcx

“ pop %rdx

“ pop %rsi

“ pop %rdi

“ pop %rax

“ ret

”);

上面__fentry__函數(shù)的實現(xiàn)把所有傳參寄存器(x86_64架構(gòu))全部壓棧,然后把sp指針傳給ftracer()的第一個參數(shù)。

__attribute__((used)) void ftracer(struct frame *fr)

{

if (!tenabled)

return;

struct trace *t = &tbuf[tcur++];

if (tcur 》= TSIZE)

tcur = 0;

t-》tstamp = __builtin_ia32_rdtsc();

t-》src = fr-》caller;

t-》dst = fr-》callee;

t-》arg1 = fr-》rdi;

t-》arg2 = fr-》rsi;

t-》arg3 = fr-》rdx;

}

struct frame {

uint64_t r9;

uint64_t r8;

uint64_t rcx;

uint64_t rdx;

uint64_t rsi;

uint64_t rdi;

uint64_t rax;

uint64_t callee;

uint64_t caller;

};

其中callee是被調(diào)用函數(shù)地址,caller是調(diào)用函數(shù)地址 ,比如f1()調(diào)用f2(), f2函數(shù)頭上調(diào)用了__fentry__, 那么__fentry__ 就可以從frame結(jié)構(gòu)中的rax變量地址之后找到callee和caller

f1() {

call f2

f2() {

call __fentry__

ftracer()的實現(xiàn)把函數(shù)調(diào)用參數(shù),被調(diào)用函數(shù),調(diào)用函數(shù),函數(shù)執(zhí)行時間戳都存在tbuf中

使用一個測試程序驗證ftrace功能:

test.c

#include “ftracer.h”

#define mb() asm volatile (“” ::: “memory”)

void f3(int a, int b, int c)

{

mb();

}

void f2(int a, int b, int c)

{

f3(4, 5, 6);

}

void f1(int a, int b, int c)

{

f2(7, 8, 9);

}

main()

{

ftrace_dump_at_exit(0);

ftrace_enable();

f1(1, 2, 3);

}

函數(shù)調(diào)用關(guān)系:main-》f1-》f2-》f3

編譯:

gcc -c ftracer.cgcc -pg -mfentry ftracer.o test.c -o test

執(zhí)行。/test的時候調(diào)用ftrace_dump(), 打印出tbuf中的數(shù)據(jù),

void ftrace_dump(unsigned max)

t = &tbuf[i];

printf(“%llx %llx-》%llx %llx %llx %llx

”,

t-》tstamp,

t-》src, t-》dst,

t-》arg1, t-》arg2, t-》arg3);

tbuf中包含函數(shù)調(diào)用關(guān)系和函數(shù)執(zhí)行時時間戳:

。/test

2b4fcfe84137ab 4008d1-》400893 4 5 6 (f2-》f3)

2b4fcfe8413763 4008fe-》4008ac 7 8 9 (f1-》f2)

2b4fcfe84136ee 40092d-》4008d9 1 2 3 (main-》f1)

以上函數(shù)調(diào)用關(guān)系對應(yīng)各個函數(shù)代碼段:

function f2:

0x00000000004008a7 《+0》: callq 0x400657 《__fentry__》

0x00000000004008ac 《+5》: push %rbp

0x00000000004008ad 《+6》: mov %rsp,%rbp

0x00000000004008cc 《+37》: callq 0x40088e 《f3》

0x00000000004008d1 《+42》: nop

0x00000000004008d2 《+43》: leaveq

0x00000000004008d3 《+44》: retq

function f3:

0x000000000040088e 《+0》: callq 0x400657 《__fentry__》

0x0000000000400893 《+5》: push %rbp

0x00000000004008a6 《+24》: retq

function f1

0x00000000004008d4 《+0》: callq 0x400657 《__fentry__》

0x00000000004008d9 《+5》: push %rbp

0x00000000004008f4 《+32》: mov $0x7,%edi

0x00000000004008f9 《+37》: callq 0x4008a7 《f2》

0x00000000004008fe 《+42》: nop

0x00000000004008ff 《+43》: leaveq

0x0000000000400900 《+44》: retq

function main

0x0000000000400901 《+0》: callq 0x400657 《__fentry__》

0x0000000000400928 《+39》: callq 0x4008d4 《f1》

0x000000000040092d 《+44》: mov $0x0,%eax

0x0000000000400932 《+49》: pop %rbp

0x0000000000400933 《+50》: retq

總結(jié):以上分析了ftracer用于用戶空間,可以跟蹤函數(shù)調(diào)用參數(shù)和函數(shù)執(zhí)行時間戳。

小編最新一直被催更微信公眾號文章,我最近一直在設(shè)計優(yōu)化tracer視頻課程,內(nèi)容已經(jīng)迭代了四五次了,希望到時候能通俗易懂、圖文并茂地講解Linux內(nèi)核中function tracer /function graph/ kprobe/kretprobe/trace event 的最底層原理和應(yīng)用,預(yù)期三月下旬發(fā)布。

掌握之后將對Linux kernel的研究學(xué)習(xí)方式和debug方式帶來很大的幫助,big picture 如下圖所示:

原文標(biāo)題:當(dāng)ftrace用于用戶空間

文章出處:【微信公眾號:Linuxer】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213744
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3826

    瀏覽量

    82965

原文標(biāo)題:當(dāng)ftrace用于用戶空間

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何在Linux內(nèi)核5.18版本之后和64位架構(gòu)從內(nèi)核空間調(diào)用ioctl?

    我嘗試在最近的內(nèi)核重新構(gòu)建以前版本 (4.19) 的 Linux 設(shè)備驅(qū)動程序,即嵌入式平臺上的 6.1.22,ARM64 架構(gòu)。 驅(qū)動程序管理 tty 設(shè)備。 當(dāng)我調(diào)用類似于用戶空間
    發(fā)表于 04-02 06:06

    請問Linux用戶空間可以調(diào)用SCFW API嗎?

    還是僅內(nèi)核空間作? 我想在 Linux 為 imx8 Quad Max 燒錄保險絲,由于產(chǎn)品的設(shè)計,使用 uboot/串行加載器是有問題的。
    發(fā)表于 03-31 07:50

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間用戶空間的數(shù)據(jù)拷貝之獲取用戶空間數(shù)據(jù)

    /environment-setup-cortexa7hf-neon-poky-linux-gnueabi elf@ubuntu:~/work/test/03_內(nèi)核空間用戶空間的數(shù)
    發(fā)表于 03-22 09:25

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間用戶空間的數(shù)據(jù)拷貝之獲取內(nèi)核空間數(shù)據(jù)

    使用copy_to_user()函數(shù)將數(shù)據(jù)復(fù)制到用戶空間之前,通常會更新offset的值,以確保下一次讀取操作從正確的位置開始。這樣可以實現(xiàn)逐步讀取大文件或在多次讀取定位到不同位置的功能。 完整
    發(fā)表于 03-21 14:00

    飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間用戶空間的數(shù)據(jù)拷貝之獲取用戶空間數(shù)據(jù)

    /environment-setup-cortexa7hf-neon-poky-linux-gnueabi elf@ubuntu:~/work/test/03_內(nèi)核空間用戶空間的數(shù)
    發(fā)表于 03-21 13:58

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間用戶空間的數(shù)據(jù)拷貝之?dāng)?shù)據(jù)拷貝介紹

    本帖最后由 jf_13411809 于 2025-3-20 14:10 編輯 在Linux系統(tǒng),內(nèi)核空間用戶空間是兩個獨立的地址
    發(fā)表于 03-20 11:50

    飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間用戶空間的數(shù)據(jù)拷貝之獲取內(nèi)核空間數(shù)據(jù)

    /environment-setup-cortexa7hf-neon-poky-linux-gnueabi elf@ubuntu:~/work/test/03_內(nèi)核空間用戶空間的數(shù)據(jù)
    發(fā)表于 03-20 11:48

    飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間用戶空間的數(shù)據(jù)拷貝之?dāng)?shù)據(jù)拷貝介紹

    Linux系統(tǒng),內(nèi)核空間用戶空間是兩個獨立的地址空間,它們有不同的訪問權(quán)限和內(nèi)存保護機制。
    發(fā)表于 03-19 08:55

    飛凌嵌入式ElfBoard ELF 1板卡-Linux設(shè)備驅(qū)動的分類

    內(nèi)核模塊嵌入到Linux內(nèi)核,位于內(nèi)核空間。它們直接與內(nèi)核進行交互,通過內(nèi)核提供的接口與硬件設(shè)備進行通信和控制。用戶空間的應(yīng)用程序通過系統(tǒng)
    發(fā)表于 03-10 17:00

    Linux用戶與創(chuàng)建

    Linux用戶與創(chuàng)建 用戶的類型 超級管理用戶: 權(quán)限最高的用戶(uid:0) #uid:是
    的頭像 發(fā)表于 12-20 14:24 ?734次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b>的<b class='flag-5'>用戶</b>與創(chuàng)建

    Linux用戶管理終極指南:從基礎(chǔ)到進階

    登陸系統(tǒng),只不過Linux支持多個用戶同時登陸。 F:難道Windows就不算多用戶操作系統(tǒng)嗎? Q:其實不是,在Windows系統(tǒng)可以創(chuàng)建多個
    的頭像 發(fā)表于 12-04 11:42 ?617次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>用戶</b>管理終極指南:從基礎(chǔ)到進階

    Linux學(xué)習(xí)之用戶管理

    Linux學(xué)習(xí)——用戶管理 1用戶/組概覽 Linux系統(tǒng)是多用戶、多任務(wù)的分時操作系統(tǒng),系統(tǒng)上每一個進程都有一個特定的文件,每個文件都被一
    的頭像 發(fā)表于 11-25 10:47 ?597次閱讀

    Linux用戶管理詳解

    用戶分為普通用戶和超級用戶,超級用戶在Windows系統(tǒng)為Administrator在Linux
    的頭像 發(fā)表于 11-01 09:48 ?546次閱讀

    詳解linux內(nèi)核的uevent機制

    linux內(nèi)核,uevent機制是一種內(nèi)核和用戶空間通信的機制,用于通知用戶
    的頭像 發(fā)表于 09-29 17:01 ?1887次閱讀

    linux驅(qū)動程序運行在什么空間

    空間擁有對硬件的直接訪問權(quán)限,而用戶空間則受到限制,以保護系統(tǒng)的穩(wěn)定性和安全性。 1. Linux 內(nèi)核和驅(qū)動程序概述 Linux 內(nèi)核是操
    的頭像 發(fā)表于 08-30 14:37 ?904次閱讀