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

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

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

3天內不再提示

基于ubuntu22.04-深入淺出 eBPF

Rice嵌入式開發技術分享 ? 2023-06-12 11:20 ? 次閱讀

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

什么是BPF

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

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

「在這篇論文中,作者描述了他們如何在Unix內核實現網絡數據包過濾,這種新的技術比當時最先進的數據包過濾技術快20倍。如下圖來源于論文:」

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

「通俗易懂的理解上圖,BPF是作為網絡報文傳輸的旁路鏈路,當接收到的網絡報文到達內閣驅動程序后,網絡報文在傳輸給網絡協議棧的同時,會額外將網絡報文的副本傳輸給BPF。之后網絡報文會經過BPF程序的內部邏輯進行過濾,最終再送到用戶程序。」

「BPF 在數據包過濾上引入了兩大革新:」

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

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

什么是eBPF

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

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

eBPF原理

** eBPF技術架構圖:**549d3d42-07f1-11ee-9c1d-dac502259ad0.png

eBPF主要分為用戶空間程序與內核程序兩大部分:

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

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

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

eBPF環境搭建

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

  1. 更新系統的包索引和包列表:
#aptupdate
  1. 編譯 BPF 程序需要系統安裝必備的 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的內核版本,安裝對應的內核源碼,并解壓源碼:
#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. 編譯內核源碼的bpf模塊,如果沒有報錯,說明已經完成環境搭建:
#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樣例編寫

在內核源碼的samples/bpf目錄下提供了很多實例供我們學習,通過目錄下的makefile就可以構建里面的bpf程序,如果我們用 C 語言編寫的 BPF 程序編譯可以直接在該目錄提供的環境中進行編譯。

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

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

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

  1. youyeetoo_user.c的內容:
#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的內容:
#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下查看編譯結果,可以看到youyeetoo可執行文件:
#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可執行文件,在終端2中執行任意命令,在終端1查看程序是否能夠監測到,如果成功監測到新進程運行便會輸出一條“bpf_trace_printk: Hello”
54e76c46-07f1-11ee-9c1d-dac502259ad0.png


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

文章出處:【微信公眾號:Rice 嵌入式開發技術分享】歡迎添加關注!文章轉載請注明出處。


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

    關注

    0

    文章

    296

    瀏覽量

    41503
  • BPF
    BPF
    +關注

    關注

    0

    文章

    25

    瀏覽量

    4015
收藏 人收藏

    評論

    相關推薦

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

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

    深入淺出AVR

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

    深入淺出玩轉FPGA

    深入淺出玩轉FPGA
    發表于 07-21 09:21

    深入淺出ARM7

    深入淺出ARM7
    發表于 08-18 10:12

    HDMI技術深入淺出

    HDMI技術深入淺出
    發表于 08-19 10:52

    深入淺出Android

    深入淺出Android
    發表于 08-20 10:14

    深入淺出Android

    深入淺出Android
    發表于 04-26 10:48

    深入淺出安防視頻監控系統

    深入淺出安防視頻監控系統深入淺出安防視頻監控系統
    發表于 05-22 19:28

    深入淺出AVR

    深入淺出AVR
    發表于 08-23 10:10

    深入淺出數據分析

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

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

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

    深入淺出Android—Android開發經典教材

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

    深入淺出數字信號處理

    深入淺出數字信號處理
    發表于 12-07 20:14 ?543次閱讀

    基于ebpf的性能工具-bpftrace

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

    ebpf的快速開發工具--libbpf-bootstrap

    基于ubuntu22.04-深入淺出 eBPF 基于ebpf的性能工具-bpftrace 基于ebpf的性能工具-bpftrace腳本語法
    的頭像 發表于 09-25 09:04 ?1033次閱讀
    <b class='flag-5'>ebpf</b>的快速開發工具--libbpf-bootstrap
    主站蜘蛛池模板: 内射爽无广熟女亚洲| 午夜福利试看120秒体验区| 野花高清影视免费观看| 精品国产成人a区在线观看| 在线中文字幕亚洲日韩| 欧美一区二区VA毛片视频| 跪趴式啪啪GIF动态图27报| 亚洲精品天堂无码中文字幕影院 | 亚洲午夜久久久久久久久电影网| 久久re视频这里精品一本到99| 99久久99久久精品国产片果冻| 兽交白浆喷水高潮| 久久水蜜桃亚洲AV无码精品偷窥| 成人久久欧美日韩一区二区三区| 亚洲乱码在线卡一卡二卡新区| 免费夜里18款禁用软粉色| 国产精品一区第二页| 67194con免费福和视频| 天堂草原天黑黑| 免费A级毛片无码无遮挡| 国产精品久久久久久久久无码 | 大迪克黑人异族| 在线亚洲精品国产一区麻豆| 日韩一区二区天海翼| 久久蜜视频| 国产精品99久久久久久WWW| 中文字幕精品视频在线| 忘忧草研究院一二三| 嗯呐啊唔高H兽交| 火影小南被爆羞羞网站| 德国xxxx| 97视频在线观看免费视频| 亚洲精品第二页| 日本孕妇大胆孕交| 巨胸美乳中文在线观看| 国产午夜视频在永久在线观看| p影院永久免费| 最近日本字幕MV免费观看在线| 午夜特级毛片| 日本另类xxxx| 嫩草成人国产精品|