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

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

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

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

如何使用BPF對Linux內(nèi)核進(jìn)行實(shí)時(shí)跟蹤

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

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

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

2. BPF驗(yàn)證器

BPF借助跟蹤探針收集信息并進(jìn)行調(diào)試和分析,與其它依賴于重新編譯內(nèi)核的工具相比,BPF程序的安全性更高。重新編譯內(nèi)核引入外部模塊的方式,可能會因?yàn)槌绦虻腻e(cuò)誤而產(chǎn)生系統(tǒng)奔潰。BPF程序的驗(yàn)證器會在BPF程序加載到內(nèi)核之前分析程序,消除這種風(fēng)險(xiǎn)。

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

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

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

程序不包含任何無法到達(dá)的指令;

程序不會超出程序界限。

BPF驗(yàn)證器執(zhí)行的第二項(xiàng)檢查是對BPF程序進(jìn)行預(yù)運(yùn)行,所做工作為:

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

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

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

3. 內(nèi)核探針 kprobes

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

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

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

缺點(diǎn) 沒有穩(wěn)定的應(yīng)用程序二進(jìn)制接口,可能隨著內(nèi)核版本的演進(jìn)而更改。

3.2 kprobes

kprobe程序允許在執(zhí)行內(nèi)核函數(shù)之前插入BPF程序。當(dāng)內(nèi)核執(zhí)行到kprobe掛載的內(nèi)核函數(shù)時(shí),先運(yùn)行BPF程序,BPF程序運(yùn)行結(jié)束后,返回繼續(xù)開始執(zhí)行內(nèi)核函數(shù)。下面是一個(gè)使用kprobe的bcc程序示例,功能是監(jiān)控內(nèi)核函數(shù)kfree_skb函數(shù),當(dāng)此函數(shù)觸發(fā)時(shí),記錄觸發(fā)它的進(jìn)程pid,進(jìn)程名字和觸發(fā)次數(shù),并打印出觸發(fā)此函數(shù)的進(jìn)程pid,進(jìn)程名字和觸發(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程序主要包括兩個(gè)部分,一部分是python語言,一部分是c語言。python部分主要做的工作是BPF程序的加載和操作BPF程序的map,并進(jìn)行數(shù)據(jù)處理。c部分會被llvm編譯器編譯為BPF字節(jié)碼,經(jīng)過BPF驗(yàn)證器驗(yàn)證安全后,加載到內(nèi)核中執(zhí)行。python和c中出現(xiàn)的陌生函數(shù)可以查下面這兩個(gè)手冊,在此不再贅述:

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

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

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

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

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

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

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

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

程序運(yùn)行結(jié)果如下:

3.3 kretprobes

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

以上面的BPF程序?yàn)槔粢褂胟retprobe,可以這樣修改:

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

b.attach_kretprobe()指定了該BPF程序類型為kretprobe,kretprobe類型的BPF程序?qū)⒃诟櫟膬?nèi)核函數(shù)有返回值時(shí)執(zhí)行BPF程序;

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

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

4. 內(nèi)核靜態(tài)跟蹤點(diǎn) tracepoint

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

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

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

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

4.2 tracepoint 可用跟蹤點(diǎn)

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

使用命令perf list 也可以列出可使用的tracepoint點(diǎn):

對于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)中的跟蹤點(diǎn)“kfree_skb”:

5. 總結(jié)

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

責(zé)任編輯:gt

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

    關(guān)注

    3

    文章

    1391

    瀏覽量

    40602
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11373

    瀏覽量

    211298
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3305

    瀏覽量

    58203

原文標(biāo)題:使用EBPF追蹤LINUX內(nèi)核

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

收藏 人收藏

    評論

    相關(guān)推薦

    2025年常用實(shí)時(shí)Linux系統(tǒng)深度評測

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

    Linux實(shí)時(shí)查看日志的四種命令詳解

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

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡介

    linux官網(wǎng)下載穩(wěn)定版本的內(nèi)核,將其適配到各個(gè)芯片上,芯片原廠也會對內(nèi)核進(jìn)行維護(hù)形成自己的維護(hù)版本。最后是板卡廠商,會到芯片原廠獲取已經(jīng)適配好的穩(wěn)定版本的
    發(fā)表于 12-16 13:08

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡介

    linux官網(wǎng)下載穩(wěn)定版本的內(nèi)核,將其適配到各個(gè)芯片上,芯片原廠也會對內(nèi)核進(jìn)行維護(hù)形成自己的維護(hù)版本。最后是板卡廠商,會到芯片原廠獲取已經(jīng)適配好的穩(wěn)定版本的
    發(fā)表于 12-13 09:03

    國產(chǎn)實(shí)時(shí)操作系統(tǒng):和RT-Linux,Zephyr的實(shí)時(shí)性對比

    基于RT-Thread內(nèi)核,并具備POSIX用戶態(tài)運(yùn)行環(huán)境的高性能實(shí)時(shí)操作系統(tǒng)。它類似Linux、Windows的架構(gòu),具備用戶態(tài)和內(nèi)核態(tài)(并相分離),用戶態(tài)具備全地址空
    的頭像 發(fā)表于 11-12 01:07 ?1609次閱讀
    國產(chǎn)<b class='flag-5'>實(shí)時(shí)</b>操作系統(tǒng):和RT-<b class='flag-5'>Linux</b>,Zephyr的<b class='flag-5'>實(shí)時(shí)</b>性對比

    linux實(shí)時(shí)系統(tǒng)還是分時(shí)操作系統(tǒng)

    系統(tǒng)就難以滿足實(shí)時(shí)性需求,但是目前linux社區(qū)已經(jīng)增加了較多版本的實(shí)時(shí)性補(bǔ)丁,給linux內(nèi)核打上實(shí)時(shí)
    的頭像 發(fā)表于 11-11 11:43 ?783次閱讀

    deepin社區(qū)亮相第19屆中國Linux內(nèi)核開發(fā)者大會

    中國 Linux 內(nèi)核開發(fā)者大會,作為中國 Linux 內(nèi)核領(lǐng)域最具影響力的峰會之一,一直以來都備受矚目。
    的頭像 發(fā)表于 10-29 16:35 ?652次閱讀

    linux驅(qū)動程序如何加載進(jìn)內(nèi)核

    Linux系統(tǒng)中,驅(qū)動程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們允許內(nèi)核與硬件設(shè)備進(jìn)行通信,從而實(shí)現(xiàn)對硬件設(shè)備的控制和管理。 驅(qū)動程序的編寫 驅(qū)動程序的編寫是
    的頭像 發(fā)表于 08-30 15:02 ?699次閱讀

    Linux內(nèi)核測試技術(shù)

    Linux 內(nèi)核Linux操作系統(tǒng)的核心部分,負(fù)責(zé)管理硬件資源和提供系統(tǒng)調(diào)用接口。隨著 Linux 內(nèi)核的不斷發(fā)展和更新,其復(fù)雜性和代碼規(guī)
    的頭像 發(fā)表于 08-13 13:42 ?688次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>測試技術(shù)

    Linux內(nèi)核中的頁面分配機(jī)制

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

    實(shí)測14us,Linux-RT實(shí)時(shí)性能及開發(fā)案例分享—基于全志T507-H國產(chǎn)平臺

    龍科技提供的案例用戶手冊進(jìn)行操作,使用Cyclictest程序測試系統(tǒng)實(shí)時(shí)性,得出如下測試結(jié)果。 圖2 Linux-RT-4.9.170內(nèi)核測試結(jié)果圖3
    發(fā)表于 07-25 15:58

    歡創(chuàng)播報(bào) 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核

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

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

    龍科技提供的案例用戶手冊進(jìn)行操作,使用Cyclictest程序測試系統(tǒng)實(shí)時(shí)性,得出如下測試結(jié)果。 對比測試數(shù)據(jù),可看到基于Linux-RT-4.9.170內(nèi)核的系統(tǒng)的延時(shí)更加穩(wěn)定,
    發(fā)表于 06-03 09:50

    內(nèi)核實(shí)時(shí)操作系統(tǒng)的介紹

    內(nèi)核實(shí)時(shí)操作系統(tǒng)(Microkernel Real-Time Operating System, μRTOS)是一種專為實(shí)時(shí)設(shè)計(jì)的操作系統(tǒng)。它采用微內(nèi)核架構(gòu),以提高系統(tǒng)的可靠性、安全性和可擴(kuò)展性。以下是關(guān)于微
    的頭像 發(fā)表于 05-11 17:13 ?628次閱讀

    使用 PREEMPT_RT 在 Ubuntu 中構(gòu)建實(shí)時(shí) Linux 內(nèi)核

    盟通技術(shù)干貨構(gòu)建實(shí)時(shí)Linux內(nèi)核簡介盟通技術(shù)干貨Motrotech如果需要在Linux中實(shí)現(xiàn)實(shí)時(shí)計(jì)算性能,進(jìn)而有效地將
    的頭像 發(fā)表于 04-12 08:36 ?3017次閱讀
    使用 PREEMPT_RT 在 Ubuntu 中構(gòu)建<b class='flag-5'>實(shí)時(shí)</b> <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核</b>
    主站蜘蛛池模板: 久久综合香蕉久久久久久久 | 一区二区三区无码高清视频 | 伊人网站在线 | 草草久久久亚洲AV成人片 | 国产精品色欲AV亚洲三区软件 | 理论片午午伦夜理片影院 | 秋霞午夜一级理论片久久 | www红色一片 | 国产精品九九久久精品视 | 国产黄A片在线观看永久免费麻豆 | 一边捏奶头一边啪高潮会怎么样 | YELLOW视频在线观看免费版高清 | 色婷婷综合久久久久中文一区二区 | 久久嫩草影院网站 | 午夜国产羞羞视频免费网站 | 国内视频在线精品一区 | yellow片高清视频免费看 | 成人精品视频在线观看 | 三级黄色在线视频中文 | 美女张开腿让我了一夜 | 九色PORNY蝌蚪视频首页 | 美女被触手注入精子强制受孕漫画 | 亚洲三级在线看 | 国产精品高清m3u8在线播放 | 钉钉女老师 | 牛牛在线国产精品 | 久久99热这里只频精品6 | 国产WW久久久久久久久久 | 中文字幕蜜臀AV熟女人妻 | 精精国产www视频在线观看免费 | WWW国产亚洲精品久久麻豆 | 奇米色偷偷 | 国产欧美一区二区精品仙草咪 | 亚洲精品人成电影网 | 99久久精品免费精品国产 | 不戴套挺进人妻怀孕 | 欧美一区二区日韩一区二区 | 日韩高清毛片 | 国产69精品麻豆久久久久 | 狠狠色色综合站 | 欧美精品AV无码一区二区 |