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

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

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

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

教你們?nèi)绾问褂胑BPF追蹤LINUX內(nèi)核

Linux閱碼場(chǎng) ? 來(lái)源:Linux內(nèi)核之旅 ? 作者:梁金榮 ? 2021-04-20 11:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 前言

我們可以使用BPF對(duì)Linux內(nèi)核進(jìn)行跟蹤,收集我們想要的內(nèi)核數(shù)據(jù),從而對(duì)Linux中的程序進(jìn)行分析和調(diào)試。與其它的跟蹤技術(shù)相比,使用BPF的主要優(yōu)點(diǎn)是幾乎可以訪問Linux內(nèi)核和應(yīng)用程序的任何信息,同時(shí),BPF對(duì)系統(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)核引入外部模塊的方式,可能會(huì)因?yàn)槌绦虻腻e(cuò)誤而產(chǎn)生系統(tǒng)奔潰。BPF程序的驗(yàn)證器會(huì)在BPF程序加載到內(nèi)核之前分析程序,消除這種風(fēng)險(xiǎn)。

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

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

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

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

程序不會(huì)超出程序界限。

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

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

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

預(yù)運(yùn)行將程序控制流的執(zhí)行結(jié)果通知驗(yàn)證器,確保BPF程序最終都會(huì)執(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) 動(dòng)態(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語(yǔ)言,一部分是c語(yǔ)言。python部分主要做的工作是BPF程序的加載和操作BPF程序的map,并進(jìn)行數(shù)據(jù)處理。c部分會(huì)被llvm編譯器編譯為BPF字節(jié)碼,經(jīng)過(guò)BPF驗(yàn)證器驗(yàn)證安全后,加載到內(nèi)核中執(zhí)行。python和c中出現(xiàn)的陌生函數(shù)可以查下面這兩個(gè)手冊(cè),在此不再贅述:

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

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

需要說(shuō)明的是,該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)檢測(cè)到內(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é)果如下:

e2411330-a100-11eb-8b86-12bb97331649.png

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)核人員添加的,不會(huì)全面涵蓋內(nèi)核的所有子系統(tǒng)。

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

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

e24d14fa-a100-11eb-8b86-12bb97331649.png

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

e2629bc2-a100-11eb-8b86-12bb97331649.png

對(duì)于bcc程序來(lái)說(shuō),以監(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”:

e29048b0-a100-11eb-8b86-12bb97331649.png

5. 總結(jié)

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

參考資料:

若未安裝bcc,請(qǐng)參考下方網(wǎng)址進(jìn)行安裝;

https://github.com/iovisor/bcc/blob/master/INSTALL.md

bcc程序編寫指導(dǎo)手冊(cè)

https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md

參考書《Linux內(nèi)核觀測(cè)技術(shù) BPF》

編輯:jq

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

    關(guān)注

    1

    文章

    972

    瀏覽量

    30471
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4876

    瀏覽量

    90030
  • BCC
    BCC
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    7766
  • BPF
    BPF
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    4709

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    進(jìn)迭時(shí)空 Upstream | K3 獲得 Linux 7.0 內(nèi)核原生支持

    2026年2月22日,隨著Linux內(nèi)核正式發(fā)布v7.0-rc1版本,全球開源社區(qū)迎來(lái)了RISC-V生態(tài)的歷史性跨越。進(jìn)迭時(shí)空(SpacemiT)研發(fā)的高性能RISC-VAICPU芯片K3作為全球首
    的頭像 發(fā)表于 02-27 18:10 ?8328次閱讀
    進(jìn)迭時(shí)空 Upstream | K3 獲得 <b class='flag-5'>Linux</b> 7.0 <b class='flag-5'>內(nèi)核</b>原生支持

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)

    Linux 內(nèi)核中,內(nèi)存管理是整個(gè)系統(tǒng)穩(wěn)定運(yùn)行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機(jī)制,更是驅(qū)動(dòng)開發(fā)、內(nèi)核模塊開發(fā)的必備知識(shí)點(diǎn)。它通過(guò) "2
    的頭像 發(fā)表于 02-10 16:58 ?3630次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)

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

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

    Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

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

    深入RK3588內(nèi)核:rockchip_linux_defconfig的作用與調(diào)試價(jià)值

    在 RK3588 芯片的 Linux 開發(fā)中,有一個(gè)文件始終是開發(fā)者繞不開的核心 ——kernel/arch/arm64/configs/rockchip_linux_defconfig。無(wú)論是首次
    的頭像 發(fā)表于 02-03 15:56 ?1159次閱讀
    深入RK3588<b class='flag-5'>內(nèi)核</b>:rockchip_<b class='flag-5'>linux</b>_defconfig的作用與調(diào)試價(jià)值

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

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

    深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    ,背后都離不開內(nèi)核調(diào)度算法的精準(zhǔn)操控。今天,我們就從優(yōu)先級(jí)、調(diào)度算法、時(shí)間片分配到底層實(shí)現(xiàn),全方位拆解Linux內(nèi)核進(jìn)程調(diào)度的核心邏輯。 一、進(jìn)程調(diào)度的“身份標(biāo)識(shí)”:優(yōu)先級(jí)與分類 要理解調(diào)度邏輯,首先得搞懂:進(jìn)程憑什么“插隊(duì)”?
    的頭像 發(fā)表于 12-24 07:05 ?4305次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

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

    本手冊(cè)由創(chuàng)龍科技研發(fā),針對(duì) DR1M90,詳述 Linux-RT 實(shí)時(shí)內(nèi)核開發(fā):含實(shí)時(shí)性測(cè)試(LinuxLinux-RT 對(duì)比、CPU 空載 / 滿負(fù)荷 / 隔離狀態(tài)測(cè)試)、
    的頭像 發(fā)表于 12-02 10:38 ?1179次閱讀
    基于 DR1M90 的 <b class='flag-5'>Linux</b>-RT <b class='flag-5'>內(nèi)核</b>開發(fā):從編譯配置到 GPIO / 按鍵應(yīng)用實(shí)現(xiàn)(1)

    Linux內(nèi)核printk日志級(jí)別全解析:從參數(shù)解讀到實(shí)操配置

    一、開篇:一個(gè)命令引出的核心問題 在?Linux?終端執(zhí)行?cat /proc/sys/kernel/printk,你可能會(huì)看到這樣的輸出: 這串?dāng)?shù)字不是隨機(jī)的,而是內(nèi)核日志系統(tǒng)的“核心配置開關(guān)
    的頭像 發(fā)表于 11-20 15:54 ?1705次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>printk日志級(jí)別全解析:從參數(shù)解讀到實(shí)操配置

    deepin亮相2025中國(guó)Linux內(nèi)核開發(fā)者大會(huì)

    11 月 1 日,第二十屆中國(guó) Linux 內(nèi)核開發(fā)者大會(huì)(CLK)在深圳舉辦。CLK 作為國(guó)內(nèi) Linux 內(nèi)核領(lǐng)域極具影響力的峰會(huì),由清華大學(xué)、Intel、華為、阿里云、富士通南大
    的頭像 發(fā)表于 11-05 17:59 ?820次閱讀

    Linux內(nèi)核參數(shù)調(diào)優(yōu)方案

    在高并發(fā)微服務(wù)環(huán)境中,網(wǎng)絡(luò)性能往往成為K8s集群的瓶頸。本文將深入探討如何通過(guò)精細(xì)化的Linux內(nèi)核參數(shù)調(diào)優(yōu),讓你的K8s節(jié)點(diǎn)網(wǎng)絡(luò)性能提升30%以上。
    的頭像 發(fā)表于 08-06 17:50 ?954次閱讀

    如何配置和驗(yàn)證Linux內(nèi)核參數(shù)

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

    手把手教你如何調(diào)優(yōu)Linux網(wǎng)絡(luò)參數(shù)

    在高并發(fā)網(wǎng)絡(luò)服務(wù)場(chǎng)景中,Linux內(nèi)核的默認(rèn)網(wǎng)絡(luò)參數(shù)往往無(wú)法滿足需求,導(dǎo)致性能瓶頸、連接超時(shí)甚至服務(wù)崩潰。本文基于真實(shí)案例分析,從參數(shù)解讀、問題診斷到優(yōu)化實(shí)踐,手把手教你如何調(diào)優(yōu)Linux
    的頭像 發(fā)表于 05-29 09:21 ?965次閱讀

    Linux內(nèi)核編譯失???移動(dòng)硬盤和虛擬機(jī)的那些事兒

    Linux開發(fā)中,編譯內(nèi)核是一項(xiàng)常見任務(wù),但不少開發(fā)者在移動(dòng)硬盤或虛擬機(jī)環(huán)境下嘗試時(shí)會(huì)遭遇失敗。本文將簡(jiǎn)要探討這些問題的成因,并介紹一些虛擬機(jī)使用技巧,幫助大家更好地應(yīng)對(duì)相關(guān)問題。在移動(dòng)硬盤里編譯
    的頭像 發(fā)表于 04-11 11:36 ?994次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>編譯失敗?移動(dòng)硬盤和虛擬機(jī)的那些事兒

    樹莓派4 性能大比拼:標(biāo)準(zhǔn)Linux與實(shí)時(shí)Linux 4.19內(nèi)核的延遲測(cè)試

    引言本文是對(duì)我之前關(guān)于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標(biāo)準(zhǔn)內(nèi)核,以及應(yīng)用了RT補(bǔ)丁的相似內(nèi)核版本。對(duì)于實(shí)時(shí)版,我
    的頭像 發(fā)表于 03-25 09:39 ?815次閱讀
    樹莓派4 性能大比拼:標(biāo)準(zhǔn)<b class='flag-5'>Linux</b>與實(shí)時(shí)<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內(nèi)核</b>的延遲測(cè)試