那曲檬骨新材料有限公司

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

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

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

eBPF是什么以及eBPF能干什么

Linux閱碼場 ? 來源:演道網(wǎng) ? 作者:演道網(wǎng) ? 2021-07-05 15:17 ? 次閱讀

一、eBPF是什么

eBPF是extended BPF的縮寫,而BPF是Berkeley Packet Filter的縮寫。對linux網(wǎng)絡(luò)比較熟悉的伙伴對BPF應(yīng)該比較了解,它通過特定的語法規(guī)則使用基于寄存器的虛擬機(jī)來描述包過濾的行為。比較常用的功能是通過過濾來統(tǒng)計(jì)流量,tcpdump工具就是基于BPF實(shí)現(xiàn)的。而eBPF對它進(jìn)行了擴(kuò)展來實(shí)現(xiàn)更多的功能。

主要區(qū)別如下:

1)允許使用C 語言編寫代碼片段,并通過LLVM編譯成eBPF 字節(jié)碼;2)cBPF 只實(shí)現(xiàn)了SOCKET_FILTER,而eBPF還有KPROBE 、PERF等。3)BPF使用socket 實(shí)現(xiàn)了用戶態(tài)與內(nèi)核交互,eBPF 則定義了一個(gè)專用于eBPF 的新的系統(tǒng)調(diào)用,用于裝載BPF 代碼段、創(chuàng)建和讀取BPF map,更加通用。4)BPF map 機(jī)制,用于在內(nèi)核中以key-value 的方式臨時(shí)存儲(chǔ)BPF 代碼產(chǎn)生的數(shù)據(jù)。

對于eBPF可以簡單的理解成kernel實(shí)現(xiàn)了一個(gè)虛擬機(jī)機(jī)制,將類C代碼編譯成字節(jié)碼(后文有詳細(xì)解釋),掛在到內(nèi)核的鉤子上,當(dāng)鉤子被觸發(fā)時(shí),kernel在虛擬機(jī)的“沙盒”中運(yùn)行字節(jié)碼,這樣既能方便的實(shí)現(xiàn)很多功能,也能通過沙箱保證內(nèi)核的安全性。

二、eBPF能干什么

如果說BPF專注于流量監(jiān)控,那么eBPF主要專注的是性能領(lǐng)域,通過各種鉤子,能在用戶空間得到系統(tǒng)各種性能指標(biāo)??梢源蟮奖O(jiān)控系統(tǒng)整體的統(tǒng)計(jì)指標(biāo),也可以小到一個(gè)系統(tǒng)函數(shù)的運(yùn)行時(shí)間。

這里需要提一下開源項(xiàng)目 BPF Compiler Collection (BCC),這是一個(gè)很方便的基于eBPF的系統(tǒng)監(jiān)視工具,下面這張BCC的說明圖就能很好的說明我們使用eBPF能夠做到的事。BCC在android系統(tǒng)上也可以運(yùn)行,但是要對系統(tǒng)進(jìn)行一定程度的修改,后續(xù)可能會(huì)寫單獨(dú)的文章進(jìn)行講解。對于內(nèi)核開發(fā)者我還比較關(guān)注怎么自己來實(shí)現(xiàn)監(jiān)控的功能,下文也將做簡單的講解。

從上圖,我么可以看到,eBPF幾乎能監(jiān)控系統(tǒng)的所有方面:

1)應(yīng)用及虛擬機(jī)的各種指標(biāo)2)系統(tǒng)庫性能監(jiān)控3)kernel系統(tǒng)調(diào)用性能4)文件系統(tǒng)性能5)網(wǎng)絡(luò)調(diào)用性能6)CPU調(diào)度器性能7)內(nèi)存管理性能8)中斷性能

三、eBPF框架

在開始說明之前先解釋下eBPF上的名詞,來幫忙更好的理解。

1)eBPF bytecode:將C語言寫的鉤子代碼,通過clang編譯成二進(jìn)制字節(jié)碼,通過程序加載到內(nèi)核中,鉤子觸發(fā)后在kernel “虛擬機(jī)”中運(yùn)行。2)JIT: Just-in-time compilation,將字節(jié)碼編譯成本地機(jī)器碼來提升運(yùn)行速度,和Java中的概念類似。

3)Maps:鉤子代碼可以將一些統(tǒng)計(jì)類信息保存在鍵值對的map中,來與用戶空間程序進(jìn)行通信,傳遞數(shù)據(jù)。

關(guān)于eBPF機(jī)制詳細(xì)的講解網(wǎng)上有很多,這里就不展開了,這里先上一張圖,這里包括了使用或者編寫ebpf涉及到的所有東西,下面會(huì)對這個(gè)圖進(jìn)行詳細(xì)的講解。

1)foo_kern.c 鉤子實(shí)現(xiàn)代碼,主要負(fù)責(zé):

聲明使用的Map節(jié)點(diǎn)

聲明鉤子掛載點(diǎn)及處理函數(shù)

2)通過LLVM/clang編譯成字節(jié)碼

編譯命令:clang --target=bpf

android平臺(tái)有集成eBPF的編譯,后文會(huì)提到

3)foo_user.c 用戶空間處理函數(shù),主要負(fù)責(zé):

將foo_kern.c 編譯成的字節(jié)碼加載到kenel中

讀取Map中的信息并處理輸出給用戶

4)kernel當(dāng)收到eBPF的加載請求時(shí),會(huì)先對字節(jié)碼進(jìn)行驗(yàn)證,并通過JIT編譯為機(jī)器碼,當(dāng)鉤子事件來臨后,調(diào)用鉤子函數(shù) kernel會(huì)對加載的字節(jié)碼進(jìn)行驗(yàn)證,來保證系統(tǒng)的安全性,主要驗(yàn)證規(guī)則如下:

a. 檢查是否聲明了GNU GPL,檢查kernel的版本是否支持

b. 函數(shù)調(diào)用規(guī)則:

允許bpf函數(shù)之間的相互調(diào)用

只允許調(diào)用kernel允許的BPF helper函數(shù),具體可以參考linux/bpf.h文件

上述以外的函數(shù)及動(dòng)態(tài)鏈接都是不允許的。

c. 流程處理規(guī)則:

不允許使用loop循環(huán)以防止進(jìn)入死循環(huán)卡死kernel

不允許有不可到達(dá)的分支代碼

d. 堆棧大小被限制在MAX_BPF_STACK范圍內(nèi)。

e. 編譯的字節(jié)碼大小被限制在BPF_COMPLEXITY_LIMIT_INSNS范圍內(nèi)。

5)鉤子掛載點(diǎn),主要包括:

另外在kernel的源代碼中samples/bpf目錄下有大量的示例,感興趣的可以閱讀下。

四、eBPF在Android平臺(tái)的使用

經(jīng)過上面枯燥的講解,大家應(yīng)該對eBPF有了基礎(chǔ)的認(rèn)識,下面我們就來通過android平臺(tái)上的一個(gè)監(jiān)控性能的小例子來實(shí)操下。

這個(gè)小例子的需求是統(tǒng)計(jì)系統(tǒng)中每個(gè)應(yīng)用在一段時(shí)間內(nèi)系統(tǒng)調(diào)用的次數(shù)。

1. android系統(tǒng)對eBPF的編譯支持

目前android編譯系統(tǒng)已經(jīng)對eBPF進(jìn)行了集成,通過android.bp就能很方便的在android源代碼中編譯eBPF的字節(jié)碼。

android.bp示例:

相關(guān)的編譯代碼在soong的bpf.go,雖然google關(guān)于soong的文檔很少,但是至少代碼是比較清晰的。

這里的$ccCmd一般是clang, 所以它的編譯命令主要是clang --target=bpf。和普通的bpf編譯沒有區(qū)別。

2. eBPF鉤子代碼實(shí)現(xiàn)

解決了編譯問題,下一步我們開始實(shí)現(xiàn)鉤子代碼,我們準(zhǔn)備使用tracepoint鉤子,首先要找到我們需要的tracepoint函數(shù)sys_enter和sys_exit。

函數(shù)定義在include/trace/events/syscalls.h文件中

1)sys_enter的trace參數(shù)是id 和長度為6的數(shù)組。2)sys_exit的trace參數(shù)是兩個(gè)長整形數(shù) id 和ret。

找到了鉤子后,下一步就可以編寫鉤子處理代碼了:

1)定義map保存系統(tǒng)調(diào)用統(tǒng)計(jì)信息,在DEFINE_BPF_MAP聲明map的同時(shí),也會(huì)生成刪,改,查的宏函數(shù),例如本例中會(huì)生成如下函數(shù)

bpf_pid_syscall_map_lookup_elem

bpf_pid_syscall_map_update_elem

bpf_pid_syscall_map_delete_elem

2)定義回調(diào)函數(shù)參數(shù)類型,需要參考前面的tracepoint的定義。3)指定監(jiān)聽的tracepoint事件。4)使用bpf_trace_printk函數(shù)打印debug信息,會(huì)直接打印信息到ftrace中。5)在map中查找指定key。6)更新指定的key的值。

3. 加載鉤子代碼

我們只需要把我們編譯出來的*.o文件push到手機(jī)的system/etc/bpf目錄下,重啟手機(jī),系統(tǒng)會(huì)自動(dòng)加載我們的鉤子文件,加載成功后會(huì)在 /sys/fs/bpf目錄下顯示我們定義的map及prog文件。

系統(tǒng)加載代碼在system/bpf/bpfloader中,代碼很簡單。

主要有如下操作:

1)在early-init階段向下面兩個(gè)節(jié)點(diǎn)寫1

– /proc/sys/net/core/bpf_jit_enable

使能eBPF JIT,當(dāng)內(nèi)核設(shè)定BPF_JIT_ALWAYS_ON的時(shí)候,默認(rèn)為1

– /proc/sys/net/core/bpf_jit_kallsyms

使特權(quán)用戶可以通過kallsyms節(jié)點(diǎn)讀取kernel的symbols

2)啟動(dòng)bpfloader service

– 讀取system/etc/bpf目錄下的*.o文件,調(diào)用libbpf_android.so中的loadProg函數(shù)加載進(jìn)內(nèi)核。

– 生成相應(yīng)的/sys/fs/bpf/節(jié)點(diǎn)。

– 設(shè)置屬性bpf.progs_loaded為1

sys節(jié)點(diǎn)分為map節(jié)點(diǎn)和prog節(jié)點(diǎn)兩種, 分別為map_《filename》_《mapname》, prog_《filename》_《mapname》

下面是Android Q版本上的節(jié)點(diǎn)信息。

可以使用下面的命令調(diào)試動(dòng)態(tài)加載

4. 用戶空間程序?qū)崿F(xiàn)

下面我們需要編寫用戶空間的顯示程序,本質(zhì)上就是在用戶態(tài)通過系統(tǒng)調(diào)用把BPF map給讀出來。

1)eBPF統(tǒng)計(jì)只有在調(diào)用bpf_attach_tracepoint只有才會(huì)起作用。bpf_attach_tracepoint是bcc里面的函數(shù),android將bcc的一部分內(nèi)容打包成了libbpf,放到了系統(tǒng)庫里面。2)取得map的fd, bpf_obj_get會(huì)直接調(diào)用bpf的系統(tǒng)調(diào)用。3)將fd包裝成BpfMap,android在BpfMap.h中定義了很多方便的函數(shù)。4)遍歷map回調(diào)函數(shù)。返回值必須是android::ok(在android的新版本中已經(jīng)進(jìn)行修改)。

5. 運(yùn)行結(jié)果查看

直接在目錄下執(zhí)行mm,將編譯出來的bpf.o push到/system/etc/bpf目錄下,將統(tǒng)計(jì)程序push到/system/bin目錄下,重啟,看下結(jié)果。

前面的是pid, 后面的是系統(tǒng)調(diào)用次數(shù)。

至此,如何在android平臺(tái)使用eBPF實(shí)現(xiàn)統(tǒng)計(jì)系統(tǒng)中每個(gè)pid在一段時(shí)間內(nèi)系統(tǒng)調(diào)用的次數(shù)的功能就介紹完了。

此外還有很多技術(shù)細(xì)節(jié)沒有深入研究,不過畢竟只是初探,就先講到這里了,后續(xù)有時(shí)間再進(jìn)一步深入研究。研究的時(shí)間還是比較短,如果有任何錯(cuò)誤的地方歡迎指正。

參考資料

eBPF 簡史 (下篇):

https://cloud.tencent.com/developer/article/1006318

goolge原生使用ebpf的兩篇文章:

https://source.android.com/devices/architecture/kernel/bpf

https://source.android.com/devices/tech/datausage/ebpf-traffic-monitor

BCC:

https://github.com/iovisor/bcc

編輯:jq

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

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62973
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4827

    瀏覽量

    69054
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    661

    瀏覽量

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

    關(guān)注

    0

    文章

    25

    瀏覽量

    4054

原文標(biāo)題:android平臺(tái)eBPF初探

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

收藏 人收藏

    評論

    相關(guān)推薦

    PLM項(xiàng)目管理系統(tǒng)主要干什么?制造業(yè)企業(yè)的PLM應(yīng)用與效益

    在制造業(yè)的數(shù)字化轉(zhuǎn)型浪潮中,PLM(Product Lifecycle Management,產(chǎn)品全生命周期管理)項(xiàng)目管理系統(tǒng)扮演著至關(guān)重要的角色。那么,PLM項(xiàng)目管理系統(tǒng)主要干什么呢?簡而言之
    的頭像 發(fā)表于 12-04 11:19 ?704次閱讀
    PLM項(xiàng)目管理系統(tǒng)主要<b class='flag-5'>干什么</b>?制造業(yè)企業(yè)的PLM應(yīng)用與效益

    eBPF技術(shù)實(shí)踐之virtio-net網(wǎng)卡隊(duì)列可觀測

    時(shí),這一路徑難以進(jìn)行觀測。一些復(fù)雜的網(wǎng)絡(luò)抖動(dòng)問題很可能是由于網(wǎng)卡隊(duì)列不正常工作引起的。為了解決這類問題,我們基于eBPF技術(shù)擴(kuò)展了網(wǎng)卡隊(duì)列的可觀測能力,使得virtio網(wǎng)卡前后端的定界問題不再困擾。 virtio-net 前后端驅(qū)動(dòng)簡介 virtio-net (后面稱為 virtio 網(wǎng)卡)通常由兩個(gè)組件
    的頭像 發(fā)表于 11-14 11:18 ?267次閱讀
    <b class='flag-5'>eBPF</b>技術(shù)實(shí)踐之virtio-net網(wǎng)卡隊(duì)列可觀測

    TLC555這個(gè)電路的二極管是干什么用的,它是從哪來的?

    就這個(gè)電路二極管不知道干什么用的,它是從哪來的? 仿真結(jié)果跟官方的不一樣
    發(fā)表于 11-08 15:37

    LM318 COMP管腳是什么引腳,干什么用的?

    LM318 COMP 管腳是什么引腳,干什么用的,PSPICEFORTI 里面沒有318的COMP管腳在怎么應(yīng)用
    發(fā)表于 07-31 07:45

    知道壓敏電阻能干什么?

    壓敏電阻是一種具有非線性伏安特性的電阻器件,用于電子產(chǎn)品中的過電壓、過電流和防雷擊保護(hù),防止電子元件受損。壓敏電阻可應(yīng)用于電源保護(hù)、通信設(shè)備、工業(yè)控制等領(lǐng)域,保障設(shè)備正常運(yùn)行。
    的頭像 發(fā)表于 06-21 10:38 ?937次閱讀
    知道壓敏電阻<b class='flag-5'>能干什么</b>?

    請問CUBE中SPI配置的CRC Polynomial多項(xiàng)式是干什么用的?

    初學(xué)STM32,用原子的板子在學(xué),現(xiàn)在學(xué)到SPI,配置的時(shí)候看到這個(gè)東西,請問是干什么用的?和傳統(tǒng)庫中哪個(gè)匹配的? 而且這個(gè)配置沒有選項(xiàng),貌似全是自己輸入的。
    發(fā)表于 05-07 06:41

    美國云服務(wù)器是干什么

    美國云服務(wù)器主要用于提供計(jì)算資源、托管網(wǎng)站、應(yīng)用程序以及存儲(chǔ)數(shù)據(jù)等。很多用戶想要了解美國云服務(wù)器具體是干什么的,rak部落小編為您整理發(fā)布美國云服務(wù)器是干什么的。 美國云服務(wù)器是一種**基于云
    的頭像 發(fā)表于 04-10 10:16 ?481次閱讀

    安泰功率信號源能干什么

    功率信號源是一種電子設(shè)備,主要用于產(chǎn)生高精度、高穩(wěn)定性的功率信號,其輸出功率可以在很寬的范圍內(nèi)進(jìn)行調(diào)節(jié)。下面我們將詳細(xì)介紹功率信號源的用途和作用。 功率信號源可用于測試和校準(zhǔn)。在電子產(chǎn)品生產(chǎn)和研發(fā)過程中,需要對各個(gè)模塊和組件進(jìn)行測試和校準(zhǔn),以保證產(chǎn)品的品質(zhì)和性能指標(biāo)。其中測試和校準(zhǔn)是重要的環(huán)節(jié)之一。功率信號源可以提供精確的、可控的功率信號,使得測試和校準(zhǔn)成為可能。 功率信號源可以用于各種測試和測量應(yīng)用
    的頭像 發(fā)表于 03-19 16:30 ?352次閱讀
    安泰功率信號源<b class='flag-5'>能干什么</b>用

    eBPF動(dòng)手實(shí)踐系列三:基于原生libbpf庫的eBPF編程改進(jìn)方案簡析

    在上一篇文章《eBPF動(dòng)手實(shí)踐系列二:構(gòu)建基于純C語言的eBPF項(xiàng)目》中,我們初步實(shí)現(xiàn)了脫離內(nèi)核源碼進(jìn)行純C語言eBPF項(xiàng)目的構(gòu)建。libbpf庫在早期和內(nèi)核源碼結(jié)合的比較緊密,如今的libbpf庫更加成熟,已經(jīng)完全脫離內(nèi)核源碼
    的頭像 發(fā)表于 03-19 14:19 ?911次閱讀
    <b class='flag-5'>eBPF</b>動(dòng)手實(shí)踐系列三:基于原生libbpf庫的<b class='flag-5'>eBPF</b>編程改進(jìn)方案簡析

    基于原生libbpf庫的eBPF編程改進(jìn)方案

    為了簡化 eBPF程序的開發(fā)流程,降低開發(fā)者在使用 libbpf 庫時(shí)的入門難度,libbpf-bootstrap 框架應(yīng)運(yùn)而生?;趌ibbpf-bootstrap框架的編程方案是目前網(wǎng)絡(luò)上看到的最主流編程方案。
    發(fā)表于 03-19 14:19 ?720次閱讀
    基于原生libbpf庫的<b class='flag-5'>eBPF</b>編程改進(jìn)方案

    fpga是干什么工作的

    FPGA(現(xiàn)場可編程門陣列)主要被用于進(jìn)行邏輯設(shè)計(jì)、算法實(shí)現(xiàn)、功能定義以及時(shí)序優(yōu)化等工作。具體來說,F(xiàn)PGA工程師的主要職責(zé)包括但不限于以下幾個(gè)方面。
    的頭像 發(fā)表于 03-14 17:09 ?1584次閱讀

    請問CYUSB3014芯片的OTG_ID引腳是干什么用的?

    USB3014芯片的OTG_ID引腳是干什么用的??用電阻下拉接地可以嗎? 電阻的大小有要求嗎?
    發(fā)表于 02-29 08:21

    在整個(gè)電路的最末端,有一個(gè)4.7K的電阻并在5V和地中間,是干什么用的?

    在整個(gè)電路的最末端,有一個(gè)4.7K的電阻并在5V和地中間,是干什么用的?
    發(fā)表于 02-22 07:49

    美國云服務(wù)器是干什么

    對于美國服務(wù)器是干什么的,相信很多小白用戶不是非常了解,接下來小編就為您整理發(fā)布美國云服務(wù)器是干什么的相關(guān)資訊,希望對您有幫助。
    的頭像 發(fā)表于 02-19 09:53 ?493次閱讀

    云服務(wù)器是干什么

     云服務(wù)器是干什么的?很多小白用戶會(huì)有疑惑,今天小編為您整理云服務(wù)器是干什么的相關(guān)資料,希望對您了解云服務(wù)器是干什么的有幫助。
    的頭像 發(fā)表于 02-18 09:58 ?1552次閱讀
    豪享博百家乐官网的玩法技巧和规则 | 澳门百家乐官网小游戏| 百家乐官网怎么赢对子| 百家乐官网塑料扑克牌盒| 百家乐官网九| 八大胜百家乐现金网| 百家乐官网心术| 百家乐官网最好投注法是怎样的去哪儿能了解一下啊| 百家乐官网路单生| 百家乐电投网站| 大发888娱乐城客户端lm0| 金冠娱乐城最新网址| 在线百家乐| 线上百家乐官网赌法| 百家乐路单资料| 威尼斯人娱乐城网| 皇冠网219678| 百家乐官网论坛官网| 百家乐下载免费软件| 大发888真钱游戏下载365| 百家乐官网网站排行| 百家乐官网平注法到| 筹码百家乐的玩法技巧和规则 | 六合彩网址| 澳门百家乐官网出千| 百家乐官网娱乐平台官网网| 上市百家乐评论| 博盈开户| 凤城市| 百家乐官网投注平台信誉排行| 利澳百家乐官网的玩法技巧和规则| 百家乐送彩金平台| 大发888游戏平台hana| 百家乐官网庄闲收益率| 百家乐真人游戏开户| 大发888网页游戏| 哪个百家乐官网技巧平台信誉好| 注册百家乐送彩金 | 新世纪娱乐| 百家乐官网赌博策略大全| 百家乐游戏客户端|