- 深入理解eBPF與可觀測性
- 毛文安 鄭昱笙 程書意 廖肇燕
- 776字
- 2025-06-09 17:11:31
2.1.3 使用C語言編寫eBPF程序
eBPF程序通常通過C語言編寫,然后使用專門的編譯器(例如Clang/LLVM)編譯成eBPF字節碼,這些字節碼隨后可以被加載到內核中執行。下面是一個簡單的示例代碼:

這段代碼是一個用C語言寫的eBPF程序片段,它利用kprobe(內核探針)來監控內核中tcp_sendmsg函數的調用事件。當tcp_sendmsg被調用時,該eBPF程序將執行并記錄發送消息的進程ID、命令名稱和發送的字節數。下面是該代碼的詳細解釋。
1)#include<vmlinux.h>:vmlinux.h是由Coolbpf[1]提供的一個內核頭文件,它包含了內核類型的定義,是編寫eBPF程序時常用的一個頭文件。這行代碼包含此頭文件,以便在eBPF程序中使用這些類型。
2)#include<coolbpf/coolbpf.h>:該行代碼引入了Coolbpf庫頭文件(3.5節會介紹Coolbpf開源項目),用來輔助編寫eBPF程序的一種工具的頭文件。
3)SEC("kprobe/tcp_sendmsg"):這是一個宏,用于將接下來的函數定義為一個kprobe。其中,kprobe/tcp_sendmsg指定了要掛載的kprobe函數的名,即內核中的tcp_sendmsg函數。
4)int BPF_KPROBE(tcp_sendmsg,struct sock *sk,struct msghdr *msg,size_t size):這是一個eBPF程序的入口函數定義。BPF_KPROBE是一個宏,它定義了kprobe的處理函數,該函數的名稱為tcp_sendmsg。該函數將接收3個參數,分別對應于原始tcp_sendmsg函數的參數。其參數解釋如下。
?struct sock*sk:指向socket結構的指針。
?struct msghdr*msg:指向msghdr結構體的指針。
?size_t size:表示正在發送的消息大小的值。
注意
BPF_KPROBE宏會根據運行環境的不同進行擴展,上述示例代碼中給出的參數列表可能不適用于所有環境。
5)int pid=pid();:這行代碼調用bpf_get_current_pid_tgid的輔助函數,以獲取當前進程的PID(Process ID,進程ID)。在內核中,PID和TGID(Thread Group ID,線程組ID)存儲在一個64位整數中,PID在低32位,TGID在高32位。這里只獲取PID。
6)comm(command);:該語句調用了bpf_get_current_comm的輔助函數,用該輔助函數將當前進程的命令名稱填充進command數組。
7)bpf_printk("%d/%s send %d bytes\n",pid,command,size);:這行代碼使用bpf_printk輔助函數打印信息到內核日志系統。“%d/%s send %d bytes\n”是要輸出的格式化字符串,后面的參數pid、command、size分別對應于進程ID、進程名稱和發送消息的大小。我們可以執行“cat /sys/kernel/debug/tracing/trace_pipe”來讀取eBPF bpf_printk打印的信息。
- 樂學Windows操作系統
- Citrix XenApp Performance Essentials
- Linux系統架構與運維實戰
- 發布!設計與部署穩定的分布式系統(第2版)
- WordPress Mobile Web Development:Beginner's Guide
- Moodle 3.x Teaching Techniques(Third Edition)
- Windows Server 2012網絡操作系統企業應用案例詳解
- Ceph分布式存儲實戰
- 計算機系統:基于x86+Linux平臺
- Linux基礎使用與案例
- Introduction to R for Quantitative Finance
- Hadoop Real-World Solutions Cookbook
- iOS 10快速開發:18天零基礎開發一個商業應用
- Linux從入門到精通(視頻教學版)
- SAP后勤模塊實施攻略:SAP在生產、采購、銷售、物流中的應用