BPF (eBPF) 资源大全
官方文档
内核文档
- BPF官方文档: https://docs.kernel.org/bpf/
- BPF设计: https://docs.kernel.org/bpf/bpf_design.html
- BPF指令集架构: https://docs.kernel.org/bpf/instruction-set.html
工具文档
- libbpf: https://libbpf.readthedocs.io/
- bpftool: https://docs.kernel.org/bpf/bpftool.html
- BCC: https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md
- bpftrace: https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md
学习资源
书籍
| 书名 | 作者 | 出版年份 | |——|——|———-| | Learning eBPF | Liz Rice | 2023 | | BPF Performance Tools | Brendan Gregg | 2019 | | Linux Observability with BPF | David Calavera, Lorenzo Fontana | 2019 |
在线课程
- Coursera: Linux内核编程 (包含BPF模块)
- Linux Foundation: eBPF课程
工具链
编译工具
| 工具 | 用途 | 链接 | |——|——|——| | clang | BPF程序编译 | LLVM项目 | | GCC | 从GCC 10开始支持BPF后端 | GNU GCC | | pahole | BTF信息生成 | https://git.kernel.org/pub/scm/devel/pahole/pahole.git/ |
加载和验证
| 工具 | 用途 | |——|——| | libbpf | BPF程序加载库 | | bpftool | BPF程序管理和调试 | | bpfloader | 各种语言的BPF加载器 |
高级工具
| 工具 | 用途 | 链接 | |——|——|——| | BCC | BPF编译器集合 | https://github.com/iovisor/bcc | | bpftrace | 高级BPF追踪语言 | https://github.com/iovisor/bpftrace | | ply | 轻量级BPF追踪 | https://github.com/iovisor/ply |
内核BPF子系统
关键邮件列表
- linux-bpf@vger.kernel.org: BPF子系统开发
- bpf@vger.kernel.org: BPF通用讨论
主要维护者
- Alexei Starovoitov: BPF子系统联合维护者
- Daniel Borkmann: BPF子系统联合维护者
- Andrii Nakryiko: libbpf维护者
关键Git树
- bpf.git: git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git
- bpf-next.git: git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
BPF程序类型
网络
| 程序类型 | 用途 | |———-|——| | XDP | 高速数据包处理 | | TC (Traffic Control) | 流量控制 | | Socket filter | 套接字过滤 | | Sk_skb | 套接字缓冲区处理 | | Cgroup skb | Cgroup套接字缓冲区 |
追踪和可观测性
| 程序类型 | 用途 | |———-|——| | kprobe/kretprobe | 内核函数探测 | | uprobe/uretprobe | 用户态函数探测 | | tracepoint | 内核跟踪点 | | perf_event | 性能事件 | | raw_tracepoint | 原始跟踪点 |
安全
| 程序类型 | 用途 | |———-|——| | LSM | Linux安全模块 | | Cgroup device | 设备访问控制 |
调度器 (sched_ext)
| 程序类型 | 用途 | |———-|——| | struct_ops/sched_cls | 可扩展调度器 |
其他
| 程序类型 | 用途 | |———-|——| | BPF iterator | 内核迭代器 | | BPF syscall | 系统调用拦截 |
BPF Map类型
基础Map
| Map类型 | 用途 | |———|——| | BPF_MAP_TYPE_HASH | 哈希表 | | BPF_MAP_TYPE_ARRAY | 数组 | | BPF_MAP_TYPE_LRU_HASH | LRU哈希表 | | BPF_MAP_TYPE_PERCPU_HASH | Per-CPU哈希表 | | BPF_MAP_TYPE_PERCPU_ARRAY | Per-CPU数组 |
高级Map
| Map类型 | 用途 | |———|——| | BPF_MAP_TYPE_RINGBUF | 环形缓冲区 | | BPF_MAP_TYPE_STACK | 栈 | | BPF_MAP_TYPE_QUEUE | 队列 | | BPF_MAP_TYPE_SOCKHASH | 套接字哈希 | | BPF_MAP_TYPE_REUSEPORT_SOCKARRAY | 重用端口套接字数组 |
BPF辅助函数
常用辅助函数
// 时间
u64 bpf_ktime_get_ns(void);
u64 bpf_ktime_get_boot_ns(void);
// 打印
long bpf_trace_printk(const char *fmt, u32 fmt_size, ...);
// Map操作
void *bpf_map_lookup_elem(struct bpf_map *map, const void *key);
long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags);
long bpf_map_delete_elem(struct bpf_map *map, const void *key);
// 获取当前任务
struct task_struct *bpf_get_current_task(void);
// 内存操作
long bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr);
long bpf_probe_read_user(void *dst, u32 size, const void *unsafe_ptr);
BPF验证器
验证器限制
| 限制 | 说明 | |——|——| | 指令数限制 | 默认100万条指令 | | 循环 | 有限支持,需要边界检查 | | 函数调用 | 支持BPF-to-BPF调用 | | 堆栈大小 | 512字节 |
验证器改进 (2024)
- Lazy Abstraction Refinement: LSFMM 2024提出的验证器简化方案
- LLVM改进: 编译器生成可验证代码的改进
- GCC支持: GCC BPF后端的持续改进
CO-RE (Compile Once, Run Everywhere)
原理
使用BTF (BPF Type Format)信息实现跨内核版本的可移植性。
工具
- libbpf CO-RE: 自动重定位
- bpftool gen skeleton: 生成骨架代码
示例
// 使用BPF_CORE_READ宏读取字段
struct task_struct *task = bpf_get_current_task();
pid_t pid = BPF_CORE_READ(task, pid);
高级主题
BPF和AI/ML
- 2024趋势: 使用BPF进行AI工作负载优化
- 应用: 模型推理加速、资源监控
BPF和内存管理
- eBPF-mm: 用户空间指导的内存管理
- 论文: eBPF-mm: Userspace-guided memory management in Linux with eBPF (2024)
BPF和安全
- LSM BPF: 灵活的LSM策略执行
- 运行时安全: Tetragon, Falco等工具
社区项目
Cilium
- 官网: https://cilium.io/
- 功能: 基于BPF的容器网络和安全
- 组件: Cilium, Hubble (可观测性)
Tetragon
- 官网: https://tetragon.io/
- 功能: 基于BPF的安全可观测性和运行时执行
- GitHub: https://github.com/cilium/tetragon
Pixie
- 官网: https://px.dev/
- 功能: 开源可观测性工具
- 特点: 自动遥测、应用性能监控
Falco
- 官网: https://falco.org/
- 功能: 云原生运行时安全
- 特点: 检测异常行为和威胁
Katran
- GitHub: https://github.com/facebookincubator/katran
- 功能: Facebook开源的L4负载均衡器
- 特点: 基于XDP的高性能转发
论文和研究
学术论文
| 论文 | 会议 | 年份 | |——|——|——| | The eBPF Runtime in the Linux Kernel | SOSP | 2024 | | eBPF-mm: Userspace-guided memory management | arXiv | 2024 | | FetchBPF: Customizable prefetching policies | ATC | 2024 | | XRP: In-Kernel Storage Functions with eBPF | OSDI | 2022 |
研究项目
- SchedBPF: BPF调度程序 (eBPF’25)
- Cache is King: 使用BPF的智能页面驱逐
- PageFlex: eBPF Linux分页委托 (ATC’25)
会议和活动
eBPF Summit
- 时间: 每年9月
- 形式: 线上虚拟会议
- 官网: https://ebpf.io/summit-2024/
LPC BPF Track
- LSFMM+BPF Summit: 每年5月
- 主题: 内存管理、文件系统、BPF
调试技巧
常用调试方法
# 查看BPF程序
bpftool prog list
# 查看BPF map
bpftool map list
# 查看BPF程序指令
bpftool prog dump xlated id <prog_id>
# 查看BPF程序日志
bpftool prog tracelog
# 验证BPF程序
bpftool prog load prog.o /sys/fs/bpf/prog auto
常见问题
- 验证器失败: 检查边界条件和指针访问
- 加载失败: 检查内核版本和BTF支持
- 性能问题: 使用perf和BPF profiling工具
最新趋势 (2024-2025)
技术趋势
- BPF和用户空间集成: scx_rustland等用户空间调度
- AI/ML集成: 使用BPF优化AI工作负载
- 安全增强: LSM BPF, 运行时安全检测
- 性能优化: 验证器改进、编译器优化
生态系统
- 更多语言支持: Rust, Go等语言的BPF绑定
- 工具链成熟: libbpf, bpftool持续改进
- 云服务集成: AWS, GCP, Azure的BPF支持
相关链接
- eBPF.io: https://ebpf.io/
- Cilium: https://cilium.io/
- BCC: https://github.com/iovisor/bcc
- bpftrace: https://github.com/iovisor/bpftrace
本网站内容由 AI 工具辅助生成,仅供参考和学习使用。作者不对内容的准确性、完整性和适用性做任何保证。使用本站信息所造成的任何损失,作者不承担任何责任。请在生产环境使用前进行充分测试和验证。