chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

Linux中ftracer用于用戶空間分析

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

掃碼添加小助手

加入工程師交流群

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

#define notrace __attribute__((no_instrument_function))

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

SYM_FUNC_START(__fentry__)

retq

SYM_FUNC_END(__fentry__)

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

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

以下代碼來(lái)自此git工程:

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

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

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ù)的實(shí)現(xiàn)把所有傳參寄存器(x86_64架構(gòu))全部壓棧,然后把sp指針傳給ftracer()的第一個(gè)參數(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()的實(shí)現(xiàn)把函數(shù)調(diào)用參數(shù),被調(diào)用函數(shù),調(diào)用函數(shù),函數(shù)執(zhí)行時(shí)間戳都存在tbuf中

使用一個(gè)測(cè)試程序驗(yàn)證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的時(shí)候調(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í)行時(shí)時(shí)間戳:

。/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)系對(duì)應(yīng)各個(gè)函數(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í)間戳。

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

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

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

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

責(zé)任編輯:haq

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

    關(guān)注

    88

    文章

    11681

    瀏覽量

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

    關(guān)注

    117

    文章

    3838

    瀏覽量

    85063

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配

    每個(gè)內(nèi)存地址是虛擬的,不是直接指向RAM的任何地址。當(dāng)用戶訪問(wèn)內(nèi)存的存儲(chǔ)單元時(shí),都會(huì)進(jìn)行地址轉(zhuǎn)換以匹配相應(yīng)的物理內(nèi)存。書(shū)籍的第10章討論了五個(gè)主題,對(duì)Linux內(nèi)核內(nèi)存分配進(jìn)行詳細(xì)
    發(fā)表于 01-16 20:05

    請(qǐng)問(wèn)如何利用 Keil 分析 MCU 堆棧空間?

    如何利用 Keil 分析 MCU 堆棧空間?
    發(fā)表于 11-26 07:38

    探索操作系統(tǒng)底層的關(guān)鍵接口

      在linux,將程序的運(yùn)行空間分為內(nèi)核空間用戶空間(內(nèi)核態(tài)和
    的頭像 發(fā)表于 11-08 12:42 ?669次閱讀

    Linux系統(tǒng)用戶權(quán)限詳解

    Linux 是一種開(kāi)源的、基于 Unix 的操作系統(tǒng),它因其靈活性、穩(wěn)定性和高性能而廣泛應(yīng)用于服務(wù)器、嵌入式系統(tǒng)、超級(jí)計(jì)算機(jī)、桌面計(jì)算等領(lǐng)域。
    的頭像 發(fā)表于 04-25 10:56 ?804次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>用戶</b>權(quán)限詳解

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

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

    請(qǐng)問(wèn)如何在Linux中使用幀緩沖區(qū)更新epdc顯示?

    /fbdev/mxc/mxc_epdc_v2_fb.c) 的幀緩沖驅(qū)動(dòng)程序 C 文件。我發(fā)現(xiàn) android (mxc_epdc_update_data) 定義了一個(gè)函數(shù),用于用戶
    發(fā)表于 04-01 06:41

    請(qǐng)問(wèn)Linux用戶空間可以調(diào)用SCFW API嗎?

    還是僅內(nèi)核空間作? 我想在 Linux 為 imx8 Quad Max 燒錄保險(xiǎn)絲,由于產(chǎn)品的設(shè)計(jì),使用 uboot/串行加載器是有問(wèn)題的。
    發(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ù)制到用戶空間之前,通常會(huì)更新offset的值,以確保下一次讀取操作從正確的位置開(kāi)始。這樣可以實(shí)現(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)核空間用戶空間是兩個(gè)獨(dú)立的地址
    發(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)核空間用戶空間是兩個(gè)獨(dú)立的地址空間,它們有不同的訪問(wèn)權(quán)限和內(nèi)存保護(hù)機(jī)制。
    發(fā)表于 03-19 08:55

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Linux設(shè)備驅(qū)動(dòng)的分類

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

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

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