91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

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

Linux閱碼場 ? 來源:Linux內核之旅 ? 作者:陳莉君 ? 2021-06-30 17:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 前言

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

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

2. BPF驗證器

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

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

程序不包含控制循環(huán);

程序不會執(zhí)行超過內核允許的最大指令數(shù);

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

程序不會超出程序界限。

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

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

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

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

3. 內核探針 kprobes

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

3.1 kprobes類BPF程序的優(yōu)缺點

優(yōu)點 動態(tài)跟蹤內核,可跟蹤的內核函數(shù)眾多,能夠提取內核絕大部分信息。

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

3.2 kprobes

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

#!/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,并進行數(shù)據(jù)處理。c部分會被llvm編譯器編譯為BPF字節(jié)碼,經過BPF驗證器驗證安全后,加載到內核中執(zhí)行。python和c中出現(xiàn)的陌生函數(shù)可以查下面這兩個手冊,在此不再贅述:

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

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

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

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

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

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

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

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

程序運行結果如下:

3.3 kretprobes

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

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

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

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

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

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

4. 內核靜態(tài)跟蹤點 tracepoint

tracepoint是內核靜態(tài)跟蹤點,它與kprobe類程序的主要區(qū)別在于tracepoint由內核開發(fā)人員在內核中編寫和修改。

4.1 tracepoint 程序的優(yōu)缺點

優(yōu)點 跟蹤點是靜態(tài)的,ABI更穩(wěn)定,不隨內核版本的變化而致不可用。

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

4.2 tracepoint 可用跟蹤點

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

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

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

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

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

5. 總結

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

責任編輯:gt

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

    關注

    4

    文章

    1467

    瀏覽量

    42872
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219009
  • 應用程序
    +關注

    關注

    38

    文章

    3344

    瀏覽量

    60251

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RK3562 單板機 Linux-RT 系統(tǒng)開發(fā)指南:內核配置、實時性優(yōu)化與案例詳解

    本文為創(chuàng)龍科技RK3562 單板機 Linux-RT 開發(fā)指南,核心聚焦實時內核的性能測試與開發(fā)應用。內容包括 LinuxLinux-
    的頭像 發(fā)表于 02-10 11:49 ?1.7w次閱讀
    RK3562 單板機 <b class='flag-5'>Linux</b>-RT 系統(tǒng)開發(fā)指南:<b class='flag-5'>內核</b>配置、<b class='flag-5'>實時</b>性優(yōu)化與案例詳解

    Linux內核bug狩獵指南:從棧跟蹤到修復,官方文檔教你搞定系統(tǒng)核心故障

    內核Linux 系統(tǒng)的 “心臟”—— 一旦它出 bug,小則功能異常,大則系統(tǒng)崩潰、死機。但內核 bug 往往藏在百萬行代碼中,想快速定位、修復絕非易事。
    的頭像 發(fā)表于 02-06 16:59 ?3119次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>bug狩獵指南:從棧<b class='flag-5'>跟蹤</b>到修復,官方文檔教你搞定系統(tǒng)核心故障

    Linux內核的“心跳”:jiffies如何為系統(tǒng)計時?

    Linux 內核的世界里,有一個默默工作的 "計時器"——jiffies。它不像我們手機上的時鐘那樣顯示年月日,卻掌控著內核中絕大多數(shù)時間相關的操作:從進程調度到設備驅動的定時檢查,都離不開它的身影。
    的頭像 發(fā)表于 02-04 16:27 ?816次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>的“心跳”:jiffies如何為系統(tǒng)計時?

    Linux系統(tǒng)內核參數(shù)調優(yōu)實戰(zhàn)指南

    Linux 內核參數(shù)調優(yōu)是系統(tǒng)性能優(yōu)化的核心環(huán)節(jié)。隨著云原生架構的普及和硬件性能的飛速提升,默認的內核參數(shù)配置往往無法充分發(fā)揮系統(tǒng)潛力。在高并發(fā) Web 服務、大數(shù)據(jù)處理、容器化部署等場景下,合理的
    的頭像 發(fā)表于 01-28 14:27 ?426次閱讀

    【「Linux 設備驅動開發(fā)(第 2 版)」閱讀體驗】Linux內核開發(fā)基礎

    感謝電子發(fā)燒友論壇提供的《Linux設備驅動開發(fā)(第2版)》閱讀機會,測評將從Linux內核開發(fā)基礎、Linux內核平臺抽象和設備驅動程序、
    發(fā)表于 01-12 22:45

    Linux-RT特點及簡單應用

    無法滿足實時性要求。Linux-RT通過對Linux內核進行調整和優(yōu)化,以提供更可預測、更低延遲的實時
    發(fā)表于 12-05 07:37

    基于 DR1M90 的 Linux-RT 內核開發(fā):從編譯配置到 GPIO / 按鍵應用實現(xiàn)(1)

    本手冊由創(chuàng)龍科技研發(fā),針對 DR1M90,詳述 Linux-RT 實時內核開發(fā):含實時性測試(Linux
    的頭像 發(fā)表于 12-02 10:38 ?1175次閱讀
    基于 DR1M90 的 <b class='flag-5'>Linux</b>-RT <b class='flag-5'>內核</b>開發(fā):從編譯配置到 GPIO / 按鍵應用實現(xiàn)(1)

    【米爾RK3506國產開發(fā)板評測】3、實時補丁以及EtherCAT IGH移植

    EtherCAT IgH需要保證高實時性,Preempt-RT是一種針對實時性能進行了優(yōu)化的Linux內核。與普通的
    發(fā)表于 10-27 10:09

    瑞芯微RK35XX系列Linux實時性詳細測試對比( PREEMPT_RT和Xenomai )

    工業(yè)控制、工業(yè)網(wǎng)關、軌道交通、能源電力等場景,都需要一個運行穩(wěn)定、可靠的“實時操作系統(tǒng)”。RT-Linux作為一款開源實時性操作系統(tǒng),擁有實時內核
    的頭像 發(fā)表于 09-30 16:37 ?1937次閱讀
    瑞芯微RK35XX系列<b class='flag-5'>Linux</b><b class='flag-5'>實時</b>性詳細測試對比( PREEMPT_RT和Xenomai )

    RK3506開發(fā)板Xenomai內核RT-Linux實時性系統(tǒng)適配教程與性能實測,實測僅7μs穩(wěn)定延時

    本文基于觸覺智能RK3506核心板/開發(fā)板,介紹Xenomai內核RT-Linux實時性系統(tǒng)適配,并附性能實測。簡介與實測數(shù)據(jù)Xenomai簡介XEnomai是一個實時子系統(tǒng),可與
    的頭像 發(fā)表于 09-18 14:21 ?1384次閱讀
    RK3506開發(fā)板Xenomai<b class='flag-5'>內核</b>RT-<b class='flag-5'>Linux</b><b class='flag-5'>實時</b>性系統(tǒng)適配教程與性能實測,實測僅7μs穩(wěn)定延時

    一文讀懂:嵌入式Linux實時性進階

    能夠在限定的時間內對外部時間做出相應的特性。 Linux可以通過任務調度與相應時間,中斷延遲與搶占延遲,內核可搶占性與實時補丁,實時調度策略,硬件支持來提高其
    發(fā)表于 07-10 15:26

    實時運動控制內核MotionRT750(一):驅動安裝、內核配置與使用

    實時運動控制內核MotionRT750的驅動安裝與內核配置
    的頭像 發(fā)表于 07-03 15:48 ?3676次閱讀
    強<b class='flag-5'>實時</b>運動控制<b class='flag-5'>內核</b>MotionRT750(一):驅動安裝、<b class='flag-5'>內核</b>配置與使用

    如何配置和驗證Linux內核參數(shù)

    Linux系統(tǒng)運維和性能優(yōu)化中,內核參數(shù)(sysctl)的配置至關重要。合理的參數(shù)調整可以顯著提升網(wǎng)絡性能、系統(tǒng)穩(wěn)定性及資源利用率。然而,僅僅修改參數(shù)是不夠的,如何驗證這些參數(shù)是否生效同樣關鍵。
    的頭像 發(fā)表于 05-29 17:40 ?1150次閱讀

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

    引言本文是對我之前關于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標準內核,以及應用了RT補丁的相似內核版本。對于實時版,我
    的頭像 發(fā)表于 03-25 09:39 ?809次閱讀
    樹莓派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系統(tǒng)深度評測

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