官术网_书友最值得收藏!

1.1.2 eBPF的發展史

eBPF由BPF(BSD Packet Filter或Berkeley Packet Filter)擴展而來。在1992年的USENIX會議上,Steven McCanne和Van Jacobson發布了論文“The BSD Packet Filter:A New Architecture for User-level Packet Capture”,這篇論文首次詳細介紹了BPF(即cBPF)的設計和實現原理,其中主要包括cBPF指令集、cBPF虛擬機和cBPF過濾器的實現。

直到2014年,cBPF有了進一步的發展。Alexei Starovoitov將cBPF擴展為一個通用的虛擬機,即eBPF。相比于cBPF,eBPF重新設計了指令集。新指令集更接近機器指令,以便于后續將該指令集和機器指令進行一對一的JIT編譯。而且,eBPF指令集能夠讓我們編寫更復雜、更實用的eBPF程序。此外,eBPF引入了JIT編譯器,相比于cBPF的解釋器在性能上有了極大提升。此外,eBPF還引入了verifier,在擴大應用范圍的同時確保了安全性。

2015年,LLVM(Low Level Virtual Machine)編譯器支持將C語言代碼編譯生成eBPF字節碼,告別了采用匯編形式的偽代碼編寫eBPF程序的時代。

隨后,大名鼎鼎的Brendan Gregg利用BCC讓eBPF聲名大噪。BCC將C語言的eBPF程序和Python編程語言結合起來,給我們編寫eBPF程序帶來了全新的體驗。C語言編寫的eBPF程序負責在內核收集統計數據或生成事件,然后對應的用戶空間的Python程序會收集這些數據并進行處理,充分利用了Python簡單、快捷的特點,降低了eBPF的開發門檻。

2018年,BTF(BPF Type Format,BPF類型格式,參見第3章)被引入內核。BTF是一種類似于DWARF的格式,用于描述程序中的數據類型。在BTF的幫助下,eBPF的verifier能夠借助BTF來進行驗證,以確保eBPF程序訪問內存的安全性。

2019年,bpftrace提供了一種簡潔的聲明式類C語言的腳本編程語法,使用戶能夠輕松編寫和執行跟蹤腳本。

2020年,libbpf基于BTF實現了CO-RE(Compile Once-Run EveryWhere,一次編譯,到處運行,參見第3章)功能,使得我們能夠將eBPF程序打包成二進制,而不需要在目標機器上部署Clang、LLVM等編譯工具,降低了eBPF工具的部署難度,提升了易用性。值得一提的是,大部分生產環境使用的工具都是基于libbpf來進行開發的。此外,libbpf還提供了從DWARF到BTF轉換的能力,通過去重算法能將300MB的DWARF信息轉換成3MB的BTF文件。

主站蜘蛛池模板: 石河子市| 东丰县| 贵州省| 九台市| 石屏县| 榆树市| 恩平市| 盘锦市| 潞城市| 衡阳市| 绥江县| 安新县| 萨嘎县| 龙井市| 崇州市| 宜兰县| 凤翔县| 互助| 内黄县| 广州市| 六盘水市| 哈巴河县| 盐山县| 陈巴尔虎旗| 崇信县| 措勤县| 西充县| 天全县| 阳新县| 泰安市| 辽阳县| 磐安县| 汪清县| 台北县| 镇康县| 禹州市| 延吉市| 格尔木市| 桐梓县| 泰宁县| 沙雅县|