女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

Linux中ftracer用于用戶空間分析

Linux閱碼場 ? 來源:相遇Linux ? 作者:相遇Linux ? 2021-03-10 15:33 ? 次閱讀

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

#define notrace __attribute__((no_instrument_function))

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

SYM_FUNC_START(__fentry__)

retq

SYM_FUNC_END(__fentry__)

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

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

以下代碼來自此git工程:

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

ftracer.c中對__fentry__函數進行了自定義:

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__函數的實現把所有傳參寄存器(x86_64架構)全部壓棧,然后把sp指針傳給ftracer()的第一個參數。

__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是被調用函數地址,caller是調用函數地址 ,比如f1()調用f2(), f2函數頭上調用了__fentry__, 那么__fentry__ 就可以從frame結構中的rax變量地址之后找到callee和caller

f1() {

call f2

f2() {

call __fentry__

ftracer()的實現把函數調用參數,被調用函數,調用函數,函數執行時間戳都存在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);

}

函數調用關系:main-》f1-》f2-》f3

編譯:

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

執行。/test的時候調用ftrace_dump(), 打印出tbuf中的數據,

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中包含函數調用關系和函數執行時時間戳:

。/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)

以上函數調用關系對應各個函數代碼段:

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

總結:以上分析了ftracer用于用戶空間,可以跟蹤函數調用參數和函數執行時間戳。

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

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

原文標題:當ftrace用于用戶空間

文章出處:【微信公眾號:Linuxer】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11456

    瀏覽量

    212756
  • 程序
    +關注

    關注

    117

    文章

    3820

    瀏覽量

    82388

原文標題:當ftrace用于用戶空間

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    如何在Linux內核5.18版本之后和64位架構從內核空間調用ioctl?

    我嘗試在最近的內核重新構建以前版本 (4.19) 的 Linux 設備驅動程序,即嵌入式平臺上的 6.1.22,ARM64 架構。 驅動程序管理 tty 設備。 當我調用類似于用戶空間
    發表于 04-02 06:06

    請問Linux用戶空間可以調用SCFW API嗎?

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

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-內核空間用戶空間的數據拷貝之獲取用戶空間數據

    /environment-setup-cortexa7hf-neon-poky-linux-gnueabi elf@ubuntu:~/work/test/03_內核空間用戶空間的數
    發表于 03-22 09:25

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-內核空間用戶空間的數據拷貝之獲取內核空間數據

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

    飛凌嵌入式ElfBoard ELF 1板卡-內核空間用戶空間的數據拷貝之獲取用戶空間數據

    /environment-setup-cortexa7hf-neon-poky-linux-gnueabi elf@ubuntu:~/work/test/03_內核空間用戶空間的數
    發表于 03-21 13:58

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-內核空間用戶空間的數據拷貝之數據拷貝介紹

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

    飛凌嵌入式ElfBoard ELF 1板卡-內核空間用戶空間的數據拷貝之獲取內核空間數據

    /environment-setup-cortexa7hf-neon-poky-linux-gnueabi elf@ubuntu:~/work/test/03_內核空間用戶空間的數據
    發表于 03-20 11:48

    飛凌嵌入式ElfBoard ELF 1板卡-內核空間用戶空間的數據拷貝之數據拷貝介紹

    Linux系統,內核空間用戶空間是兩個獨立的地址空間,它們有不同的訪問權限和內存保護機制。
    發表于 03-19 08:55

    飛凌嵌入式ElfBoard ELF 1板卡-Linux設備驅動的分類

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

    Linux用戶與創建

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

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

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

    Linux學習之用戶管理

    Linux學習——用戶管理 1用戶/組概覽 Linux系統是多用戶、多任務的分時操作系統,系統上每一個進程都有一個特定的文件,每個文件都被一
    的頭像 發表于 11-25 10:47 ?535次閱讀

    Linux用戶管理詳解

    用戶分為普通用戶和超級用戶,超級用戶在Windows系統為Administrator在Linux
    的頭像 發表于 11-01 09:48 ?468次閱讀

    詳解linux內核的uevent機制

    linux內核,uevent機制是一種內核和用戶空間通信的機制,用于通知用戶
    的頭像 發表于 09-29 17:01 ?1660次閱讀

    linux驅動程序運行在什么空間

    空間擁有對硬件的直接訪問權限,而用戶空間則受到限制,以保護系統的穩定性和安全性。 1. Linux 內核和驅動程序概述 Linux 內核是操
    的頭像 發表于 08-30 14:37 ?788次閱讀