第25周:eBPF 基础与工具链
目标:理解 eBPF 虚拟机的指令集、验证器机制和工具链,能够使用 bpftrace 和 bcc 编写简单内核跟踪程序。
1. eBPF 概述
1.1 什么是 eBPF?
1 | eBPF(extended Berkeley Packet Filter): |
1.2 eBPF 程序生命周期
1 | ┌─────────────┐ ┌──────────┐ ┌─────────────┐ |
1.3 与传统内核模块对比
| 特性 | 内核模块 | eBPF |
|---|---|---|
| 加载方式 | insmod | bpf() 系统调用 |
| 验证 | 人工 | 自动验证器 |
| 安全性 | 风险高 | 沙箱安全 |
| 调试难度 | 难(需要重启) | 容易(热加载) |
| 与内核耦合 | 紧 | 松(通过 helper) |
| 编程语言 | C | C + libbpf / bpftrace |
| 性能 | 高 | 高(JIT 后接近原生) |
2. eBPF 指令集
2.1 寄存器
1 | eBPF 虚拟机寄存器(共 11 个): |
2.2 指令格式
1 | eBPF 指令 = 8 bytes |
2.3 示例代码
1 | // 反汇编示例(来自 bpftool) |
3. 验证器(Verifier)
3.1 验证器职责
1 | 验证器检查 BPF 程序: |
3.2 验证器示例
1 | // ❌ 不通过:未知循环次数 |
4. 开发环境
4.1 安装依赖
1 | # Ubuntu/Debian |
4.2 关键工具
1 | # bpftool — 内核 BPF 管理工具 |
5. bcc-tools 使用
5.1 常用 bcc 工具
1 | # === 进程跟踪 === |
5.2 trace-bpf
1 | # trace-bpf.py — 通用 tracepoint 跟踪 |
6. 编写 kprobe 程序
6.1 BCC Python 风格
1 | #!/usr/bin/env python3 |
6.2 libbpf C 风格
1 | // tcp_connect.bpf.c — libbpf 风格 |
1 | # 编译 |
7. bpftrace 实战
7.1 基础语法
1 | # 一行命令 |
7.2 网络事件跟踪示例
1 | # === 跟踪网络事件 === |
7.3 跟踪进程资源
1 | # 进程打开的文件 |
8. 关键 BPF helper 函数
8.1 常用 helper
1 | // 时间 |
8.2 BPF map 类型
1 | // === Hash map === |
9. 编译工作流
9.1 libbpf 完整流程
1 | 源文件结构: |
9.2 Makefile
1 | # 简化版 Makefile |
10. 学习路径建议
1 | 第 1 步:使用 bpftrace 一行命令 |
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/06/18/第25周:eBPF 基础与工具链/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!