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

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

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

3天內不再提示

eBPF是什么以及eBPF能干什么

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

一、eBPF是什么

eBPF是extended BPF的縮寫,而BPF是Berkeley Packet Filter的縮寫。對linux網絡比較熟悉的伙伴對BPF應該比較了解,它通過特定的語法規則使用基于寄存器的虛擬機來描述包過濾的行為。比較常用的功能是通過過濾來統計流量,tcpdump工具就是基于BPF實現的。而eBPF對它進行了擴展來實現更多的功能。

主要區別如下:

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

對于eBPF可以簡單的理解成kernel實現了一個虛擬機機制,將類C代碼編譯成字節碼(后文有詳細解釋),掛在到內核的鉤子上,當鉤子被觸發時,kernel在虛擬機的“沙盒”中運行字節碼,這樣既能方便的實現很多功能,也能通過沙箱保證內核的安全性。

二、eBPF能干什么

如果說BPF專注于流量監控,那么eBPF主要專注的是性能領域,通過各種鉤子,能在用戶空間得到系統各種性能指標。可以大到監控系統整體的統計指標,也可以小到一個系統函數的運行時間。

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

從上圖,我么可以看到,eBPF幾乎能監控系統的所有方面:

1)應用及虛擬機的各種指標2)系統庫性能監控3)kernel系統調用性能4)文件系統性能5)網絡調用性能6)CPU調度器性能7)內存管理性能8)中斷性能

三、eBPF框架

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

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

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

關于eBPF機制詳細的講解網上有很多,這里就不展開了,這里先上一張圖,這里包括了使用或者編寫ebpf涉及到的所有東西,下面會對這個圖進行詳細的講解。

1)foo_kern.c 鉤子實現代碼,主要負責:

聲明使用的Map節點

聲明鉤子掛載點及處理函數

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

編譯命令:clang --target=bpf

android平臺有集成eBPF的編譯,后文會提到

3)foo_user.c 用戶空間處理函數,主要負責:

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

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

4)kernel當收到eBPF的加載請求時,會先對字節碼進行驗證,并通過JIT編譯為機器碼,當鉤子事件來臨后,調用鉤子函數 kernel會對加載的字節碼進行驗證,來保證系統的安全性,主要驗證規則如下:

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

b. 函數調用規則:

允許bpf函數之間的相互調用

只允許調用kernel允許的BPF helper函數,具體可以參考linux/bpf.h文件

上述以外的函數及動態鏈接都是不允許的。

c. 流程處理規則:

不允許使用loop循環以防止進入死循環卡死kernel

不允許有不可到達的分支代碼

d. 堆棧大小被限制在MAX_BPF_STACK范圍內。

e. 編譯的字節碼大小被限制在BPF_COMPLEXITY_LIMIT_INSNS范圍內。

5)鉤子掛載點,主要包括:

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

四、eBPF在Android平臺的使用

經過上面枯燥的講解,大家應該對eBPF有了基礎的認識,下面我們就來通過android平臺上的一個監控性能的小例子來實操下。

這個小例子的需求是統計系統中每個應用在一段時間內系統調用的次數。

1. android系統對eBPF的編譯支持

目前android編譯系統已經對eBPF進行了集成,通過android.bp就能很方便的在android源代碼中編譯eBPF的字節碼。

android.bp示例:

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

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

2. eBPF鉤子代碼實現

解決了編譯問題,下一步我們開始實現鉤子代碼,我們準備使用tracepoint鉤子,首先要找到我們需要的tracepoint函數sys_enter和sys_exit。

函數定義在include/trace/events/syscalls.h文件中

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

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

1)定義map保存系統調用統計信息,在DEFINE_BPF_MAP聲明map的同時,也會生成刪,改,查的宏函數,例如本例中會生成如下函數

bpf_pid_syscall_map_lookup_elem

bpf_pid_syscall_map_update_elem

bpf_pid_syscall_map_delete_elem

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

3. 加載鉤子代碼

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

系統加載代碼在system/bpf/bpfloader中,代碼很簡單。

主要有如下操作:

1)在early-init階段向下面兩個節點寫1

– /proc/sys/net/core/bpf_jit_enable

使能eBPF JIT,當內核設定BPF_JIT_ALWAYS_ON的時候,默認為1

– /proc/sys/net/core/bpf_jit_kallsyms

使特權用戶可以通過kallsyms節點讀取kernel的symbols

2)啟動bpfloader service

– 讀取system/etc/bpf目錄下的*.o文件,調用libbpf_android.so中的loadProg函數加載進內核。

– 生成相應的/sys/fs/bpf/節點。

– 設置屬性bpf.progs_loaded為1

sys節點分為map節點和prog節點兩種, 分別為map_《filename》_《mapname》, prog_《filename》_《mapname》

下面是Android Q版本上的節點信息。

可以使用下面的命令調試動態加載

4. 用戶空間程序實現

下面我們需要編寫用戶空間的顯示程序,本質上就是在用戶態通過系統調用把BPF map給讀出來。

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

5. 運行結果查看

直接在目錄下執行mm,將編譯出來的bpf.o push到/system/etc/bpf目錄下,將統計程序push到/system/bin目錄下,重啟,看下結果。

前面的是pid, 后面的是系統調用次數。

至此,如何在android平臺使用eBPF實現統計系統中每個pid在一段時間內系統調用的次數的功能就介紹完了。

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

參考資料

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

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

    關注

    3

    文章

    4327

    瀏覽量

    62573
  • 代碼
    +關注

    關注

    30

    文章

    4780

    瀏覽量

    68529
  • 編譯
    +關注

    關注

    0

    文章

    657

    瀏覽量

    32852
  • BPF
    BPF
    +關注

    關注

    0

    文章

    25

    瀏覽量

    4002

原文標題:android平臺eBPF初探

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

收藏 人收藏

    評論

    相關推薦

    eBPF技術實踐之virtio-net網卡隊列可觀測

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

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

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

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

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

    知道壓敏電阻能干什么

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

    請問CUBE中SPI配置的CRC Polynomial多項式是干什么用的?

    初學STM32,用原子的板子在學,現在學到SPI,配置的時候看到這個東西,請問是干什么用的?和傳統庫中哪個匹配的? 而且這個配置沒有選項,貌似全是自己輸入的。
    發表于 05-07 06:41

    美國云服務器是干什么

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

    eBPF動手實踐系列三:基于原生libbpf庫的eBPF編程改進方案簡析

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

    基于原生libbpf庫的eBPF編程改進方案

    為了簡化 eBPF程序的開發流程,降低開發者在使用 libbpf 庫時的入門難度,libbpf-bootstrap 框架應運而生。基于libbpf-bootstrap框架的編程方案是目前網絡上看到的最主流編程方案。
    發表于 03-19 14:19 ?652次閱讀
    基于原生libbpf庫的<b class='flag-5'>eBPF</b>編程改進方案

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

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

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

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

    美國云服務器是干什么

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

    云服務器是干什么

     云服務器是干什么的?很多小白用戶會有疑惑,今天小編為您整理云服務器是干什么的相關資料,希望對您了解云服務器是干什么的有幫助。
    的頭像 發表于 02-18 09:58 ?1486次閱讀

    法拉電容是干什么用的?

    法拉電容是干什么用的? 法拉電容是一種用于儲存和釋放電荷的電子元件。它是電容器的一種,與傳統的微型電容器相比,法拉電容能夠儲存更多的電能,并且能夠更快速地釋放電能。它的容量單位是法拉(F)。在本文
    的頭像 發表于 02-02 10:51 ?3440次閱讀

    云服務器是干什么的?服務器的主要功能有哪些?

    云服務器是干什么的,主要功能是什么?相信很多技術人員已經很了解,但是對于其他行業的人群云服務器又有什么用呢?擁有云服務器有什么用處呢,RAKsmart小編今天來為您做詳細的解答。
    的頭像 發表于 01-09 09:48 ?720次閱讀

    光纜是干什么用的 光纜、電纜、網線有哪些區別

    光纜是干什么用的 光纜、電纜、網線有哪些區別? 光纜是一種用于傳輸光信號的傳輸介質,它由一根或多根纖維光導芯和外部保護層組成。光纜的主要作用是傳輸光信號,用于實現遠距離的數據傳輸和通信。 光纜與電纜
    的頭像 發表于 12-27 14:09 ?3845次閱讀
    主站蜘蛛池模板: 色-情-伦-理一区二区三区| 日本国产精品无码一区免费看| 男女作爱在线播放免费网页版观看 | 欧美亚洲日韩国产在线在线| 偷窥美女3| 91在线一区二区| 国产色婷婷精品人妻蜜桃成熟| 凌晨三点免费WWW| 翁用力的抽插| 99久久99久久精品国产片果冻| 国产成人综合95精品视频免费| 快穿女主有名器的H纯肉黄暴拉文 快插我我好湿啊公交车上做 | 樱花草在线影视WWW日本动漫| 成年妇女免费播放| 老师我好爽再深一点老师好涨| 丝瓜涩涩屋黄瓜香蕉丝瓜| AV福利无码亚洲网站麻豆| 激情欧美日韩一区二区| 无毒成人社区| xxww69| 欧美另类videosbest| 伊人青青操| 久久草香蕉频线观| 十分钟免费视频大全在线观看 | 98色精品视频在线| 久久精品国产亚洲AV未满十八| 星空无限传媒视频在线观看视频| 办公室丝袜老师在线观看| 久久久久九九| 在线观看精品视频看看播放| 黑人阴茎插女人图片| 亚洲成人mv| 国产亚洲精品免费视频| 手机在线播放成人亚洲影院电影| 成人在线视频网站| 日韩 国产 欧美视频二区| 成人免费一级毛片在线播放视频| 免费看国产曰批40分钟| 99久久999久久久综合精品涩| 亚洲欧洲日产国码中学| 国产免国产免费|