在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

基于ubuntu22.04-深入淺出 eBPF

Rice嵌入式開發(fā)技術(shù)分享 ? 2023-06-12 11:20 ? 次閱讀

筆者在很早之前就看eBPF這類似的文章,那時候看這個技術(shù)一臉懵逼,不知道它是用來做什么,可以解決什么問題。所以也沒有太關(guān)注這個技術(shù)。很慶幸最近剛好有機會研究這個技術(shù)。

什么是BPF

「BPF的全稱是Berkaley Packet Filter,即伯克利報文過法器,它的設(shè)計思想來源于 1992 年Steven McCanne和Van Jacobson寫的一篇論文“The BSD packet filter. A New architecture for user-level packet apture' (《BSD數(shù)據(jù)包過濾器:一種用于用戶級數(shù)據(jù)包捕獲的新休系結(jié)構(gòu)》)。最初,BPF是在 BSD 內(nèi)核實現(xiàn)的,后來,由于其出色的設(shè)計思想,其他操作系統(tǒng)也將其引入包括 Linux。」

53eb6f40-07f1-11ee-9c1d-dac502259ad0.png

「在這篇論文中,作者描述了他們?nèi)绾卧赨nix內(nèi)核實現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包過濾,這種新的技術(shù)比當(dāng)時最先進的數(shù)據(jù)包過濾技術(shù)快20倍。如下圖來源于論文:」

543fb0f0-07f1-11ee-9c1d-dac502259ad0.png

「通俗易懂的理解上圖,BPF是作為網(wǎng)絡(luò)報文傳輸?shù)呐月锋溌罚?dāng)接收到的網(wǎng)絡(luò)報文到達內(nèi)閣驅(qū)動程序后,網(wǎng)絡(luò)報文在傳輸給網(wǎng)絡(luò)協(xié)議棧的同時,會額外將網(wǎng)絡(luò)報文的副本傳輸給BPF。之后網(wǎng)絡(luò)報文會經(jīng)過BPF程序的內(nèi)部邏輯進行過濾,最終再送到用戶程序。」

「BPF 在數(shù)據(jù)包過濾上引入了兩大革新:」

  • 一個新的虛擬機(VM)設(shè)計,可以有效地工作在基于寄存器結(jié)構(gòu)的CPU之上;
  • 應(yīng)用程序使用緩存只復(fù)制與過濾數(shù)據(jù)包相關(guān)的數(shù)據(jù),不會復(fù)制數(shù)據(jù)包的所有信息,最大程度地減少BPF處理的數(shù)據(jù),提高處理效率。

「我們熟悉的tcpdump就是基于BPF技術(shù),好比一個神器站另外一個神器的絕作。」

什么是eBPF

BPF發(fā)展到現(xiàn)在名稱升級為eBPF: 「extended Berkeley Packet Filter」。它演進成為了一套通用執(zhí)行引擎,提供可基于系統(tǒng)或程序事件高效安全執(zhí)行特定代碼的通用能力,通用能力的使用者不再局限于內(nèi)核開發(fā)者。其使用場景不再僅僅是網(wǎng)絡(luò)分析,可以基于eBPF開發(fā)性能分析、系統(tǒng)追蹤、網(wǎng)絡(luò)優(yōu)化等多種類型的工具和平臺。

5463e196-07f1-11ee-9c1d-dac502259ad0.png

eBPF原理

** eBPF技術(shù)架構(gòu)圖:**549d3d42-07f1-11ee-9c1d-dac502259ad0.png

eBPF主要分為用戶空間程序與內(nèi)核程序兩大部分:

  • 在用戶空間,程序通過LLVM/Clang被編譯成eBPF可接受的字節(jié)碼并提交到內(nèi)核,以及負責(zé)讀取內(nèi)核回傳的消息事件或統(tǒng)計信息。eBPF提供了兩種內(nèi)核態(tài)與用戶態(tài)傳遞數(shù)據(jù)的方式,內(nèi)核態(tài)可以將自定義perf_event消息事件發(fā)往用戶態(tài),或用戶態(tài)通過文件描述符讀寫存儲在內(nèi)核中的k/v Map數(shù)據(jù)。

  • 在內(nèi)核空間,為了穩(wěn)定與安全,eBPF接收的字節(jié)碼首先會交給Verifier進行安全驗證,如驗證程序循環(huán)次數(shù),數(shù)組越界問題,無法訪問的指令等等。只有校驗通過的字節(jié)碼才會提交到內(nèi)核自帶編譯器或JIT編譯器編譯成可直接執(zhí)行的機器指令。同時,eBPF對提交程序提出限制,如程序大小限制,最大可使用堆棧大小限制,可調(diào)用函數(shù)限制,循環(huán)次數(shù)限制等。

  • 從上面的架構(gòu)圖可以看出,eBPF在內(nèi)核態(tài)會依賴內(nèi)核探針進行工作,其中kprobes實現(xiàn)內(nèi)核函數(shù)動態(tài)跟蹤;uprobes實現(xiàn)用戶函數(shù)動態(tài)跟蹤;tracepoints是內(nèi)核中的靜態(tài)跟蹤點;perf_events支持定時采樣和PMC。

eBPF環(huán)境搭建

為了有一個eBPF程序編寫驗證的平臺,我在ubuntu22.04中搭建了eBPF環(huán)境,ubuntu22.04安裝流程在這里不在過多的介紹。「以下的操作都在root用戶下執(zhí)行」

  1. 更新系統(tǒng)的包索引和包列表:
#aptupdate
  1. 編譯 BPF 程序需要系統(tǒng)安裝必備的 linux-headers 包:
#sudoaptinstalllinux-headers-$(uname-r)
  1. 安裝eBPF依賴工具:
#aptinstall-ybisonflexbuild-essentialgitcmakemakelibelf-devstracetarlibfl-devlibssl-devlibedit-devzlib1g-devpythonpython3-distutils
  1. 安裝LLVM,并檢查一下版本:
#aptinstallllvm
#llc-version
UbuntuLLVMversion14.0.0

.....
wasm32-WebAssembly32-bit
wasm64-WebAssembly64-bit
x86-32-bitX86:Pentium-Proandabove
x86-64-64-bitX86:EM64TandAMD64
xcore-XCore
#
  1. 安裝Clang,并檢查一下版本:
#aptinstallclang
#clang-version
Ubuntuclangversion14.0.0-1ubuntu1
Target:x86_64-pc-linux-gnu
Threadmodel:posix
InstalledDir:/usr/bin
#
  1. 查看但錢ubuntu的內(nèi)核版本,安裝對應(yīng)的內(nèi)核源碼,并解壓源碼:
#apt-cachesearchlinux-source
linux-source-LinuxkernelsourcewithUbuntupatches
linux-source-5.19.0-Linuxkernelsourceforversion5.19.0withUbuntupatches
#aptinstalllinux-source-5.19.0
#cd/usr/src
#tar-jxvflinux-source-5.19.0.tar.bz2
#cdlinux-source-5.19.0
  1. 編譯內(nèi)核源碼的bpf模塊,如果沒有報錯,說明已經(jīng)完成環(huán)境搭建:
#cp-v/boot/config-$(uname-r).config
#makeoldconfig&&makeprepare
#makeheaders_install
#apt-getinstalllibcap-dev
#makeM=samples/bpf
CCsamples/bpf/../../tools/testing/selftests/bpf/cgroup_helpers.o
CCsamples/bpf/../../tools/testing/selftests/bpf/trace_helpers.o
CCsamples/bpf/cookie_uid_helper_example.o
CCsamples/bpf/cpustat_user.o
CCsamples/bpf/fds_example.o
....

WARNING:Symbolversiondump"Module.symvers"ismissing.
Modulesmaynothavedependenciesormodversions.
Youmaygetmanyunresolvedsymbolwarnings.

eBPF樣例編寫

在內(nèi)核源碼的samples/bpf目錄下提供了很多實例供我們學(xué)習(xí),通過目錄下的makefile就可以構(gòu)建里面的bpf程序,如果我們用 C 語言編寫的 BPF 程序編譯可以直接在該目錄提供的環(huán)境中進行編譯。

samples/bpf 下的程序一般組成方式是 xxx_user.c 和 xxx_kern.c:

  • xxx_user.c:為用戶空間的程序用于設(shè)置 BPF 程序的相關(guān)配置、加載 BPF 程序至內(nèi)核、設(shè)置 BPF 程序中的 map 值和讀取 BPF 程序運行過程中發(fā)送至用戶空間的消息等。目前 xxx_user.c 與 xxx_kern.c 程序在交互實現(xiàn)都是基于 bpf() 系統(tǒng)調(diào)用完成的。直接使用 bpf() 系統(tǒng)調(diào)用涉及的參數(shù)和細節(jié)比較多,使用門檻較高,因此為了方便用戶空間程序更加易用,內(nèi)核提供了 libbpf 庫封裝了對于 bpf() 系統(tǒng)調(diào)用的細節(jié)。
  • xxx_kern.c:為 BPF 程序代碼,通過 clang 編譯成字節(jié)碼加載至內(nèi)核中,在對應(yīng)事件觸發(fā)的時候運行,可以接受用戶空間程序發(fā)送的各種數(shù)據(jù),并將運行時產(chǎn)生的數(shù)據(jù)發(fā)送至用戶空間程序。

編寫一個樣例流程,在目錄samples/bpf中新建兩個文件:youyeetoo_user.c和youyeetoo_kern.c,并且在makefile中加入構(gòu)建:

  1. youyeetoo_user.c的內(nèi)容:
#include
#include
#include
#include"trace_helpers.h"

intmain(intac,char**argv)
{
structbpf_link*link=NULL;
structbpf_program*prog;
structbpf_object*obj;
charfilename[256];

snprintf(filename,sizeof(filename),"%s_kern.o",argv[0]);
obj=bpf_object__open_file(filename,NULL);
if(libbpf_get_error(obj)){
fprintf(stderr,"ERROR:openingBPFobjectfilefailedn");
return0;
}

prog=bpf_object__find_program_by_name(obj,"bpf_prog");
if(!prog){
fprintf(stderr,"ERROR:findingaproginobjfilefailedn");
gotocleanup;
}

/*loadBPFprogram*/
if(bpf_object__load(obj)){
fprintf(stderr,"ERROR:loadingBPFobjectfilefailedn");
gotocleanup;
}

link=bpf_program__attach(prog);
if(libbpf_get_error(link)){
fprintf(stderr,"ERROR:bpf_program__attachfailedn");
link=NULL;
gotocleanup;
}

read_trace_pipe();

cleanup:
bpf_link__destroy(link);
bpf_object__close(obj);
return0;
}

  1. youyeetoo_kern.c的內(nèi)容:
#include
#include
#include
#include

SEC("tracepoint/syscalls/sys_enter_execve")
intbpf_prog1(structpt_regs*ctx)
{
charfmt[]="youyeetoo%s!n";
charcomm[16];
bpf_get_current_comm(&comm,sizeof(comm));
bpf_trace_printk(fmt,sizeof(fmt),comm);

return0;
}

char_license[]SEC("license")="GPL";
u32_versionSEC("version")=LINUX_VERSION_CODE;
  1. Makefile 文件修改:
#diff-uMakefile.oldMakefile
---Makefile.old2021-09-2603:16:16.883348130+0000
+++Makefile2021-09-2603:20:46.732277872+0000
@@-55,6+55,7@@
tprogs-y+=xdp_sample_pkts
tprogs-y+=ibumad
tprogs-y+=hbm
+tprogs-y+=youyeetoo

#Libbpfdependencies
LIBBPF=$(TOOLS_PATH)/lib/bpf/libbpf.a
@@-113,6+114,7@@
xdp_sample_pkts-objs:=xdp_sample_pkts_user.o
ibumad-objs:=ibumad_user.o
hbm-objs:=hbm.o$(CGROUP_HELPERS)
+youyeetoo-objs:=youyeetoo_user.o$(TRACE_HELPERS)

#Tellkbuildtoalwaysbuildtheprograms
always-y:=$(tprogs-y)
@@-174,6+176,7@@
always-y+=hbm_out_kern.o
always-y+=hbm_edt_kern.o
always-y+=xdpsock_kern.o
+always-y+=youyeetoo_kern.o

ifeq($(ARCH),arm)
#Stripallexcept-D__LINUX_ARM_ARCH__optionneededtohandlelinux

eBPF樣例驗證

  1. 編譯樣例:
#makeM=samples/bpf
CCsamples/bpf/../../tools/testing/selftests/bpf/cgroup_helpers.o
CCsamples/bpf/../../tools/testing/selftests/bpf/trace_helpers.o
CCsamples/bpf/cookie_uid_helper_example.o
CCsamples/bpf/cpustat_user.o
CCsamples/bpf/fds_example.o
....
LDsamples/bpf/youyeetoo
CLANG-bpfsamples/bpf/youyeetoo_kern.o
WARNING:Symbolversiondump"Module.symvers"ismissing.
Modulesmaynothavedependenciesormodversions.
Youmaygetmanyunresolvedsymbolwarnings.
  1. 在samples/bpf下查看編譯結(jié)果,可以看到y(tǒng)ouyeetoo可執(zhí)行文件:
#ls-alyouyeetoo*
-rwxr-xr-x1rootroot4079766919:08youyeetoo
-rw-r--r--1rootroot4516910:44youyeetoo_kern.c
-rw-r--r--1rootroot52166919:08youyeetoo_kern.o
-rw-r--r--1rootroot9976910:40youyeetoo_user.c
-rw-r--r--1rootroot33606919:08youyeetoo_user.o
  1. 在ubuntu中運行兩個終端,用來測試youyeetoo:
54c3c17e-07f1-11ee-9c1d-dac502259ad0.png
  1. 在終端以運行youyeetoo可執(zhí)行文件,在終端2中執(zhí)行任意命令,在終端1查看程序是否能夠監(jiān)測到,如果成功監(jiān)測到新進程運行便會輸出一條“bpf_trace_printk: Hello”
54e76c46-07f1-11ee-9c1d-dac502259ad0.png


原文標題:基于ubuntu22.04-深入淺出 eBPF

文章出處:【微信公眾號:Rice 嵌入式開發(fā)技術(shù)分享】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。


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

    關(guān)注

    0

    文章

    296

    瀏覽量

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

    關(guān)注

    0

    文章

    25

    瀏覽量

    4020
收藏 人收藏

    評論

    相關(guān)推薦

    基于ebpf的性能工具-bpftrace腳本語法

    ,并且介紹了如何運行bpftrace腳本,這篇文章將介紹bpftrace腳本的語法。 基于ubuntu22.04-深入淺出 eBPF 基于ebpf的性能工具
    的頭像 發(fā)表于 09-04 16:04 ?1076次閱讀
    基于<b class='flag-5'>ebpf</b>的性能工具-bpftrace腳本語法

    深入淺出AVR

    深入淺出AVR,一本書。
    發(fā)表于 07-15 12:02

    深入淺出玩轉(zhuǎn)FPGA

    深入淺出玩轉(zhuǎn)FPGA
    發(fā)表于 07-21 09:21

    深入淺出ARM7

    深入淺出ARM7
    發(fā)表于 08-18 10:12

    HDMI技術(shù)深入淺出

    HDMI技術(shù)深入淺出
    發(fā)表于 08-19 10:52

    深入淺出Android

    深入淺出Android
    發(fā)表于 08-20 10:14

    深入淺出Android

    深入淺出Android
    發(fā)表于 04-26 10:48

    深入淺出安防視頻監(jiān)控系統(tǒng)

    深入淺出安防視頻監(jiān)控系統(tǒng)深入淺出安防視頻監(jiān)控系統(tǒng)
    發(fā)表于 05-22 19:28

    深入淺出AVR

    深入淺出AVR
    發(fā)表于 08-23 10:10

    深入淺出數(shù)據(jù)分析

    深入淺出數(shù)據(jù)分析,有需要的朋友下來看看。
    發(fā)表于 01-15 14:22 ?0次下載

    深入淺出談多層面板布線技巧

    深入淺出談多層面板布線技巧
    發(fā)表于 12-13 22:20 ?0次下載

    深入淺出Android—Android開發(fā)經(jīng)典教材

    深入淺出Android—Android開發(fā)經(jīng)典教材
    發(fā)表于 10-24 08:52 ?15次下載
    <b class='flag-5'>深入淺出</b>Android—Android開發(fā)經(jīng)典教材

    深入淺出數(shù)字信號處理

    深入淺出數(shù)字信號處理
    發(fā)表于 12-07 20:14 ?546次閱讀

    基于ebpf的性能工具-bpftrace

    在前面我已經(jīng)分享了關(guān)于ebpf入門的文章: 基于ubuntu22.04-深入淺出 eBPF 。 這篇文章介紹一個基于ebpf技術(shù)的強大工具-
    的頭像 發(fā)表于 09-04 16:02 ?693次閱讀
    基于<b class='flag-5'>ebpf</b>的性能工具-bpftrace

    ebpf的快速開發(fā)工具--libbpf-bootstrap

    基于ubuntu22.04-深入淺出 eBPF 基于ebpf的性能工具-bpftrace 基于ebpf的性能工具-bpftrace腳本語法
    的頭像 發(fā)表于 09-25 09:04 ?1046次閱讀
    <b class='flag-5'>ebpf</b>的快速開發(fā)工具--libbpf-bootstrap
    主站蜘蛛池模板: 日日夜夜天天久久| 欧美爆插| bt天堂资源种子在线8| 亚洲97| 性videofree极品另类| 天堂社区在线观看| 人人插视频| 久草a视频| 7777色鬼xxxx欧美色夫| 天堂在线链接| 成 人网站免费| 一级a级国产不卡毛片| 99 久久99久久精品免观看| 亚洲bbb| 欧美zoozzooz性欧美| 国产欧美高清| 久久男人精品| 国产成人毛片毛片久久网| 亚洲精品久久久久午夜三| 日本激情网| 男人女人真曰批视频播放| 国产精品午夜免费观看网站| 四虎影视永久在线 yin56xyz| 久久是精品| 天堂成人在线| 又黄又免费的网站| 久久久国产精品免费看| 香蕉视频网站在线播放| 欧美日韩生活片| 99日精品欧美国产| 久久久午夜视频| 91网址在线播放| 亚洲国产成人精品青青草原100| 在线精品一区二区三区| 三级毛片在线看| 国产免费成人在线视频| 日本欧美强乱视频在线| 中文在线 | 中文| 亚洲欧美日韩一区| 天天做人人爱夜夜爽2020| 久久久夜色精品国产噜噜|