色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

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

3天內不再提示

如何使用BPF對Linux內核進行實時跟蹤

Linux閱碼場 ? 來源:Linux內核之旅 ? 作者:陳莉君 ? 2021-06-30 17:28 ? 次閱讀
1. 前言

我們可以使用BPF對Linux內核進行跟蹤,收集我們想要的內核數據,從而對Linux中的程序進行分析和調試。與其它的跟蹤技術相比,使用BPF的主要優點是幾乎可以訪問Linux內核和應用程序的任何信息,同時,BPF對系統性能影響很小,執行效率很高,而且開發人員不需要因為收集數據而修改程序。

本文將介紹保證BPF程序安全的BPF驗證器,然后以BPF程序的工具集BCC為例,分享kprobes和tracepoints類型的BPF程序的使用及程序編寫示例。

2. BPF驗證器

BPF借助跟蹤探針收集信息并進行調試和分析,與其它依賴于重新編譯內核的工具相比,BPF程序的安全性更高。重新編譯內核引入外部模塊的方式,可能會因為程序的錯誤而產生系統奔潰。BPF程序的驗證器會在BPF程序加載到內核之前分析程序,消除這種風險。

BPF驗證器執行的第一項檢查是對BPF虛擬機加載的代碼進行靜態分析,目的是確保程序能夠按照預期結束。驗證器在進行第一項檢查時所做工作為:

程序不包含控制循環;

程序不會執行超過內核允許的最大指令數;

程序不包含任何無法到達的指令;

程序不會超出程序界限。

BPF驗證器執行的第二項檢查是對BPF程序進行預運行,所做工作為:

分析BPF程序執行的每條指令,確保不會執行無效指令;

檢查所有內存指針是否可以正確訪問和引用;

預運行將程序控制流的執行結果通知驗證器,確保BPF程序最終都會執行BPF_EXIT指令。

3. 內核探針 kprobes

內核探針可以跟蹤大多數內核函數,并且系統損耗最小。當跟蹤的內核函數被調用時,附加到探針的BPF代碼將被執行,之后內核將恢復正常模式。

3.1 kprobes類BPF程序的優缺點

優點 動態跟蹤內核,可跟蹤的內核函數眾多,能夠提取內核絕大部分信息。

缺點 沒有穩定的應用程序二進制接口,可能隨著內核版本的演進而更改。

3.2 kprobes

kprobe程序允許在執行內核函數之前插入BPF程序。當內核執行到kprobe掛載的內核函數時,先運行BPF程序,BPF程序運行結束后,返回繼續開始執行內核函數。下面是一個使用kprobe的bcc程序示例,功能是監控內核函數kfree_skb函數,當此函數觸發時,記錄觸發它的進程pid,進程名字和觸發次數,并打印出觸發此函數的進程pid,進程名字和觸發次數:

#!/usr/bin/python3

# coding=utf-8

from __future__ import print_function

from bcc import BPF

from time import sleep

# define BPF program

bpf_program = “”“

#include 《uapi/linux/ptrace.h》

struct key_t{

u64 pid;

};

BPF_HASH(counts, struct key_t);

int trace_kfree_skb(struct pt_regs *ctx) {

u64 zero = 0, *val, pid;

pid = bpf_get_current_pid_tgid() 》》 32;

struct key_t key = {};

key.pid = pid;

val = counts.lookup_or_try_init(&key, &zero);

if (val) {

(*val)++;

}

return 0;

}

”“”

def pid_to_comm(pid):

try:

comm = open(“/proc/%s/comm” % pid, “r”).read().rstrip()

return comm

except IOError:

return str(pid)

# load BPF

b = BPF(text=bpf_program)

b.attach_kprobe(event=“kfree_skb”, fn_name=“trace_kfree_skb”)

# header

print(“Tracing kfree_skb.。。 Ctrl-C to end.”)

print(“%-10s %-12s %-10s” % (“PID”, “COMM”, “DROP_COUNTS”))

while 1:

sleep(1)

for k, v in sorted(b[“counts”].items(),key = lambda counts: counts[1].value):

print(“%-10d %-12s %-10d” % (k.pid, pid_to_comm(k.pid), v.value))

該bcc程序主要包括兩個部分,一部分是python語言,一部分是c語言。python部分主要做的工作是BPF程序的加載和操作BPF程序的map,并進行數據處理。c部分會被llvm編譯器編譯為BPF字節碼,經過BPF驗證器驗證安全后,加載到內核中執行。python和c中出現的陌生函數可以查下面這兩個手冊,在此不再贅述:

python部分遇到的陌生函數可以查這個手冊: 點此跳轉

c部分中遇到的陌生函數可以查這個手冊: 點此跳轉

需要說明的是,該BPF程序類型是kprobe,它是在這里進行程序類型定義的:

b.attach_kprobe(event=“kfree_skb”, fn_name=“trace_kfree_skb”)

b.attach_kprobe()指定了該BPF程序類型為kprobe;

event=“kfree_skb”指定了kprobe掛載的內核函數為kfree_skb;

fn_name=“trace_kfree_skb”指定了當檢測到內核函數kfree_skb時,執行程序中的trace_kfree_skb函數;

BPF程序的第一個參數總為ctx,該參數稱為上下文,提供了訪問內核正在處理的信息,依賴于正在運行的BPF程序的類型。CPU將內核正在執行任務的不同信息保存在寄存器中,借助內核提供的宏可以訪問這些寄存器,如PT_REGS_RC。

程序運行結果如下:

3.3 kretprobes

相比于內核探針kprobe程序,kretprobe程序是在內核函數有返回值時插入BPF程序。當內核執行到kretprobe掛載的內核函數時,先執行內核函數,當內核函數返回時執行BPF程序,運行結束后返回。

以上面的BPF程序為例,若要使用kretprobe,可以這樣修改:

b.attach_kretprobe(event=“kfree_skb”, fn_name=“trace_kfree_skb”)

b.attach_kretprobe()指定了該BPF程序類型為kretprobe,kretprobe類型的BPF程序將在跟蹤的內核函數有返回值時執行BPF程序;

event=“kfree_skb”指定了kretprobe掛載的內核函數為kfree_skb;

fn_name=“trace_kfree_skb”指定了當內核函數kfree_skb有返回值時,執行程序中的trace_kfree_skb函數;

4. 內核靜態跟蹤點 tracepoint

tracepoint是內核靜態跟蹤點,它與kprobe類程序的主要區別在于tracepoint由內核開發人員在內核中編寫和修改。

4.1 tracepoint 程序的優缺點

優點 跟蹤點是靜態的,ABI更穩定,不隨內核版本的變化而致不可用。

缺點 跟蹤點是內核人員添加的,不會全面涵蓋內核的所有子系統。

4.2 tracepoint 可用跟蹤點

系統中所有的跟蹤點都定義在/sys/kernel/debug/traceing/events目錄中:

使用命令perf list 也可以列出可使用的tracepoint點:

對于bcc程序來說,以監控kfree_skb為例,tracepoint程序可以這樣寫:

b.attach_tracepoint(tp=“skb:kfree_skb”, fn_name=“trace_kfree_skb”)

bcc遵循tracepoint命名約定,首先是指定要跟蹤的子系統,這里是“skb:”,然后是子系統中的跟蹤點“kfree_skb”:

5. 總結

本文主要介紹了保證BPF程序安全的BPF驗證器,然后以BPF程序的工具集BCC為例,分享了kprobes和tracepoints類型的BPF程序的使用及程序編寫示例。本文分享的是內核跟蹤,那么用戶空間程序該如何跟蹤呢,這將在后面的文章中逐步分享,感謝閱讀。

責任編輯:gt

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

    關注

    3

    文章

    1406

    瀏覽量

    41045
  • Linux
    +關注

    關注

    87

    文章

    11443

    瀏覽量

    212615
  • 應用程序
    +關注

    關注

    38

    文章

    3321

    瀏覽量

    58640

原文標題:使用EBPF追蹤LINUX內核

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

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    樹莓派4 性能大比拼:標準Linux實時Linux 4.19內核的延遲測試

    引言本文是對我之前關于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標準內核,以及應用了RT補丁的相似內核版本。對于實時版,我
    的頭像 發表于 03-25 09:39 ?209次閱讀
    樹莓派4 性能大比拼:標準<b class='flag-5'>Linux</b>與<b class='flag-5'>實時</b><b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內核</b>的延遲測試

    2025年常用實時Linux系統深度評測

    1、PREEMPT-RT - 特性: ?- 實時性:通過內核補丁實現搶占式調度,響應延遲處于毫秒級別,能夠滿足一般實時應用的需求。 ?- 兼容性:與標準Linux
    的頭像 發表于 03-06 10:57 ?486次閱讀

    Linux實時查看日志的四種命令詳解

    如何在Linux實時查看日志文件的內容?那么有很多實用程序可以幫助用戶在文件更改或不斷更新時輸出文件的內容。在Linux實時顯示文件內容的常用命令是tail命令(有效地管理文件)。
    的頭像 發表于 01-13 10:45 ?2496次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>實時</b>查看日志的四種命令詳解

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-Linux內核移植之內核簡介

    linux官網下載穩定版本的內核,將其適配到各個芯片上,芯片原廠也會對內核進行維護形成自己的維護版本。最后是板卡廠商,會到芯片原廠獲取已經適配好的穩定版本的
    發表于 12-16 13:08

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內核移植之內核簡介

    linux官網下載穩定版本的內核,將其適配到各個芯片上,芯片原廠也會對內核進行維護形成自己的維護版本。最后是板卡廠商,會到芯片原廠獲取已經適配好的穩定版本的
    發表于 12-13 09:03

    國產實時操作系統:和RT-Linux,Zephyr的實時性對比

    基于RT-Thread內核,并具備POSIX用戶態運行環境的高性能實時操作系統。它類似Linux、Windows的架構,具備用戶態和內核態(并相分離),用戶態具備全地址空
    的頭像 發表于 11-12 01:07 ?2179次閱讀
    國產<b class='flag-5'>實時</b>操作系統:和RT-<b class='flag-5'>Linux</b>,Zephyr的<b class='flag-5'>實時</b>性對比

    linux實時系統還是分時操作系統

    系統就難以滿足實時性需求,但是目前linux社區已經增加了較多版本的實時性補丁,給linux內核打上實時
    的頭像 發表于 11-11 11:43 ?1040次閱讀

    deepin社區亮相第19屆中國Linux內核開發者大會

    中國 Linux 內核開發者大會,作為中國 Linux 內核領域最具影響力的峰會之一,一直以來都備受矚目。
    的頭像 發表于 10-29 16:35 ?809次閱讀

    詳解linux內核的uevent機制

    linux內核中,uevent機制是一種內核和用戶空間通信的機制,用于通知用戶空間應用程序各種硬件更改或其他事件,比如插入或移除硬件設備(如USB驅動器或網絡接口)。uevent表示“用戶空間
    的頭像 發表于 09-29 17:01 ?1612次閱讀

    linux驅動程序如何加載進內核

    Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動程序的編寫是
    的頭像 發表于 08-30 15:02 ?922次閱讀

    Linux內核測試技術

    Linux 內核Linux操作系統的核心部分,負責管理硬件資源和提供系統調用接口。隨著 Linux 內核的不斷發展和更新,其復雜性和代碼規
    的頭像 發表于 08-13 13:42 ?882次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    Linux內核中的頁面分配機制

    Linux內核中是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux內核是如何管
    的頭像 發表于 08-07 15:51 ?534次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中的頁面分配機制

    實測14us,Linux-RT實時性能及開發案例分享—基于全志T507-H國產平臺

    龍科技提供的案例用戶手冊進行操作,使用Cyclictest程序測試系統實時性,得出如下測試結果。 圖2 Linux-RT-4.9.170內核測試結果圖3
    發表于 07-25 15:58

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    1 華為宣布鴻蒙內核已超越Linux內核 ? 6月21日,在華為開發者大會上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨立于安卓和iOS的鴻蒙操作系統,正式登場。這是HarmonyOS
    的頭像 發表于 06-27 11:30 ?1128次閱讀

    基于全志T507-H的Linux-RT實時性測試案例分享

    龍科技提供的案例用戶手冊進行操作,使用Cyclictest程序測試系統實時性,得出如下測試結果。 對比測試數據,可看到基于Linux-RT-4.9.170內核的系統的延時更加穩定,
    發表于 06-03 09:50
    主站蜘蛛池模板: 欧美高清vivoesond在线播放 | 日本高清色片 | 玛雅成人网| 婷婷精品国产亚洲AV在线观看 | 日日干夜夜啪蕉视频 | 国产成人免费在线观看 | 日韩高清毛片 | 最近中文字幕无吗免费高清 | 国产盗摄TP摄像头偷窥 | 国际老妇高清在线观看 | 成 人 网 站毛片 | 91视频18| 精品国产乱码久久久久久免费流畅 | 国产精品AV色欲蜜臀在线 | 中文字幕国产在线观看 | 亚洲风情无码免费视频 | 日韩欧美一区二区三区免费观看 | 日韩欧美一区二区三区免费观看 | 国产欧美日韩综合精品一区二区 | 亚洲精品理论电影在线观看 | 在线播放免费人成视频 | 欧美性狂猛AAAAAA | 国产精品久久久久秋霞影视 | 中文字幕精品无码一区二区 | 久久国产乱子伦免费精品 | 我与旗袍老师疯狂床震 | 内射后入在线观看一区 | 四虎视频最新视频在线观看 | 小柔的性放荡羞辱日记动漫 | 四虎成人影院 | 亚洲一区国产 | 亚洲一区二区免费看 | 有人有片的观看免费视频 | 成人国内精品久久久久影院 | 黄色a级免费网站 | 97视频在线观看免费播放 | chinesevideoshd性舞 | 日韩精品专区在线影院重磅 | 黄页网站18以下勿看免费 | 草莓视频在线看免费高清观看 | 亚洲国产高清在线观看视频 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品