- 深入理解eBPF與可觀測性
- 毛文安 鄭昱笙 程書意 廖肇燕
- 755字
- 2025-06-09 17:11:24
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文件。
- Learning Android Intents
- 新手易學:系統安裝與重裝
- Extending Bootstrap
- Windows Phone應用程序開發
- Linux就該這么學
- Microsoft Operations Management Suite Cookbook
- 嵌入式實時操作系統μC/OS原理與實踐
- Learning Magento 2 Administration
- VMware Horizon View Essentials
- Learn CUDA Programming
- Mastering Windows 8 C++ App Development
- 大學計算機應用基礎實踐教程(Windows 7+MS Office 2010)
- 鴻蒙HarmonyOS應用開發從入門到精通
- Responsive Web Design with AngularJS
- OpenSolaris紅寶書