日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuà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)絡比較熟悉的伙伴對BPF應該比較了解,它通過特定的語法規(guī)則使用基于寄存器的虛擬機來描述包過濾的行為。比較常用的功能是通過過濾來統(tǒng)計流量,tcpdump工具就是基于BPF實現(xiàn)的。而eBPF對它進行了擴展來實現(xiàn)更多的功能。

主要區(qū)別如下:

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

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

二、eBPF能干什么

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

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

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

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

三、eBPF框架

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

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

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

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

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

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

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

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

編譯命令:clang --target=bpf

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

四、eBPF在Android平臺的使用

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

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

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

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

android.bp示例:

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

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

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

解決了編譯問題,下一步我們開始實現(xià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ù)是兩個長整形數(shù) id 和ret。

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

1)定義map保存系統(tǒng)調(diào)用統(tǒng)計信息,在DEFINE_BPF_MAP聲明map的同時,也會生成刪,改,查的宏函數(shù),例如本例中會生成如下函數(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信息,會直接打印信息到ftrace中。5)在map中查找指定key。6)更新指定的key的值。

3. 加載鉤子代碼

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

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

主要有如下操作:

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

– /proc/sys/net/core/bpf_jit_enable

使能eBPF JIT,當內(nèi)核設定BPF_JIT_ALWAYS_ON的時候,默認為1

– /proc/sys/net/core/bpf_jit_kallsyms

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

2)啟動bpfloader service

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

– 生成相應的/sys/fs/bpf/節(jié)點。

– 設置屬性bpf.progs_loaded為1

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

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

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

4. 用戶空間程序實現(xiàn)

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

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

5. 運行結果查看

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

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

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

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

參考資料

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)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關注

    關注

    3

    文章

    4422

    瀏覽量

    67873
  • 代碼
    +關注

    關注

    30

    文章

    4977

    瀏覽量

    74420
  • 編譯
    +關注

    關注

    0

    文章

    696

    瀏覽量

    35296
  • BPF
    BPF
    +關注

    關注

    0

    文章

    26

    瀏覽量

    4753

原文標題:android平臺eBPF初探

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    頻譜分析儀是干什么用的

    頻譜分析儀是一種專門用于信號分析的精密儀器,其核心功能是將復雜的電信號從“時間域”轉換到“頻域”進行觀察和解析。如果說示波器是觀察信號波形變化的“時域之眼”,那么頻譜分析儀就是洞察信號頻率構成的“頻域之眼”。它能夠將信號分解為不同頻率的正弦波分量,并以圖形化的方式展示各頻率成分的強度,從而幫助工程師和技術人員深入理解信號的本質。這種獨特的能力使其成為通信、電子、音頻、航空航天及科研等領域的關鍵工具。
    的頭像 發(fā)表于 04-11 15:04 ?418次閱讀
    頻譜分析儀是<b class='flag-5'>干什么</b>用的

    Kubernete網(wǎng)絡模型的原理和故障排查實踐

    在2026年的生產(chǎn)環(huán)境中,主流CNI插件形成了清晰的格局:Calico以網(wǎng)絡策略(NetworkPolicy)見長,適合安全要求高的環(huán)境;Flannel以簡單易用著稱,適合快速起步;Cilium以eBPF技術帶來革命性的性能和安全能力,是2026年的技術熱點。
    的頭像 發(fā)表于 03-31 14:38 ?148次閱讀

    南開大學捅破電池天花板,我們晶振能干什么?

    刷新聞刷到它,直接給小編整精神。南開大學和上??臻g電源研究所的團隊,2月26號在《自然》上發(fā)了篇論文——搞出一種新的電解液技術,能讓現(xiàn)在的鋰電池續(xù)航直接翻倍,零下70度還能正常工作。
    的頭像 發(fā)表于 03-06 16:44 ?2603次閱讀
    南開大學捅破電池天花板,我們晶振<b class='flag-5'>能干什么</b>?

    不間斷電源是干什么用的?優(yōu)比施一文講透

    ……這些令人懊惱甚至帶來損失的瞬間,都與一個詞有關——電力中斷。而不間斷電源,正是為解決這些問題而生。今天,優(yōu)比施電源用最通俗易懂的方式,為您講清楚不間斷電源到底是干什
    的頭像 發(fā)表于 03-03 08:48 ?343次閱讀
    不間斷電源是<b class='flag-5'>干什么</b>用的?優(yōu)比施一文講透

    lora無線數(shù)傳電臺能干什么?5KM數(shù)據(jù)傳輸,代替有線485

    雙向通信,是工業(yè)物聯(lián)網(wǎng)、智慧農(nóng)業(yè)、智慧城市等場景的“無線串口線”。 一、核心功能(能干什么) 1. 基礎通信能力 - 點對點透明傳輸:兩個電臺配對,串口數(shù)據(jù)原樣無線轉發(fā),替代長距離RS485/232線纜,無需改協(xié)議。 - 點對多點/主從組網(wǎng):一臺主機帶多臺從機,集中
    的頭像 發(fā)表于 02-28 16:37 ?770次閱讀

    三防漆多久能干

    在電子元器件防護作業(yè)中,大家常會遇到一個核心問題:三防漆多久能干?三防漆固化分為表干和完全固化兩個階段——表干是表面不粘手、無明顯流淌的狀態(tài),完全固化則是漆膜徹底固化,達到最佳防護性能。不同類型的三
    的頭像 發(fā)表于 02-27 16:00 ?275次閱讀
    三防漆多久<b class='flag-5'>能干</b>?

    新手求問,單片機的引腳為什么要接二極管再接5v?

    如圖所示的幾個4148是干什么用的
    發(fā)表于 01-27 14:42

    相控陣芯片頻段到底如何選擇

    相控陣技術早已從軍事雷達滲透到了衛(wèi)星通信、雷達感測、氣象探測等多個領域。但你知道嗎?決定相控陣芯片 “能干什么” 的核心因素,并非算力,而是它工作的頻段。
    的頭像 發(fā)表于 01-26 09:34 ?822次閱讀

    劃片機是干什么用的

    劃片機是干什么用的?在晶圓加工場景中,它也常被稱為晶圓切割機,是半導體制造后道工藝中的核心設備,其核心用途是將完成前道電路制造(如光刻、刻蝕、沉積等)的整片晶圓,沿預設的空白切割道
    的頭像 發(fā)表于 01-12 16:33 ?874次閱讀
    劃片機是<b class='flag-5'>干什么</b>用的

    2.5MW儲能干變一體機:開啟能源存儲與轉換新篇章

    自身高效且可靠的性能表現(xiàn),在集中式大型儲能領域脫穎而出,展現(xiàn)出極為顯著的優(yōu)勢。接下來,本文將全方位深入探討這一先進設備的特性、適用場景以及它對能源行業(yè)帶來的深遠影響。 一、2.5MW儲能干變一體機的技術特性剖析 2.5MW儲能干
    的頭像 發(fā)表于 09-09 10:46 ?1544次閱讀
    2.5MW儲<b class='flag-5'>能干</b>變一體機:開啟能源存儲與轉換新篇章

    加固計算機是用來干什么的?

    加固計算機是一種專門為復雜環(huán)境和特殊行業(yè)應用設計的高性能設備。它不僅具備常規(guī)電腦的數(shù)據(jù)處理和運算功能,更在結構設計、防護等級和硬件配置方面做了全面優(yōu)化。例如,它的外殼通常采用鎂鋁合金或高強度復合材料,具有防塵、防水、防摔的特性,內(nèi)部還經(jīng)過防震加固處理,確保在運輸、跌落或長時間移動中依舊保持穩(wěn)定運行。某些加固計算機甚至符合軍用標準,能夠適應極端環(huán)境和高強度任務需求。
    的頭像 發(fā)表于 08-22 09:55 ?684次閱讀

    基于eBPF的Kubernetes網(wǎng)絡異常檢測系統(tǒng)

    作為一名在云原生領域深耕多年的運維工程師,我見過太多因為網(wǎng)絡問題導致的生產(chǎn)事故。傳統(tǒng)的監(jiān)控手段往往是事后諸葛亮,當你發(fā)現(xiàn)問題時,用戶已經(jīng)在抱怨了。今天,我將分享如何利用 eBPF 這一革命性技術,構建一套能夠實時檢測 Kubernetes 網(wǎng)絡異常的系統(tǒng)。
    的頭像 發(fā)表于 07-24 14:09 ?960次閱讀

    晶振是干什么用的

    在電子設備如繁星般密布于生活各個角落的當今時代,從小巧的智能手表到龐大的服務器,從便捷的手機到家中的智能家電,有一種常常被忽視卻起著關鍵作用的元件——晶振。它體積微小,存在感看似不強,卻宛如電子設備的“心臟起搏器”,默默把控著節(jié)奏,維系著整個系統(tǒng)穩(wěn)定、精準地運行。 提供精準時鐘信號 晶振最基礎且核心的用途,便是生成高度精準的時鐘信號。在數(shù)字電路的世界里,眾多芯片、處理器如同訓練有素的士兵,需要依據(jù)統(tǒng)一
    的頭像 發(fā)表于 06-30 10:44 ?1393次閱讀

    光纖odf架干什么用的

    光纖ODF架(Optical Distribution Frame,光纖配線架)是光纖通信網(wǎng)絡中用于光纖配線與管理的核心設備,主要承擔光纖線路的連接、分配、調(diào)度及保護功能。以下從其核心作用、應用場景及技術優(yōu)勢三方面展開說明: 一、核心功能 光纖熔接與端接 提供熔接盤、適配器面板等模塊,支持光纖熔接(永久連接)或快速端接(預制成端跳線),實現(xiàn)主干光纜與分支光纜的可靠連接。 類比:如同電路中的“接線板”,將多根光纖有序整合。 線路分配與調(diào)度 通過適配器面板
    的頭像 發(fā)表于 05-21 13:53 ?2352次閱讀
    光纖odf架<b class='flag-5'>干什么</b>用的

    芯片前端設計與后端設計的區(qū)別

    前端設計(Front-end Design):聚焦于電路的邏輯功能實現(xiàn)。本質上是在“紙上”設計電路,包括芯片要“干什么”,要“如何運算”。
    的頭像 發(fā)表于 05-16 14:56 ?1560次閱讀
    镇江市| 芦山县| 枣强县| 夏邑县| 三台县| 无锡市| 遂宁市| 多伦县| 浦北县| 揭东县| 泾源县| 莎车县| 马关县| 河北省| 大兴区| 永顺县| 洛宁县| 汶上县| 民权县| 辉南县| 明水县| 冷水江市| 石城县| 安顺市| 包头市| 白玉县| 梅河口市| 古浪县| 铜川市| 馆陶县| 大丰市| 邵东县| 彩票| 巴中市| 阿尔山市| 旬邑县| 寻乌县| 永年县| 许昌县| 邵阳市| 枣强县|