BPF (eBPF) 资源大全

官方文档

内核文档

工具文档

学习资源

书籍

| 书名 | 作者 | 出版年份 | |——|——|———-| | Learning eBPF | Liz Rice | 2023 | | BPF Performance Tools | Brendan Gregg | 2019 | | Linux Observability with BPF | David Calavera, Lorenzo Fontana | 2019 |

在线课程

工具链

编译工具

| 工具 | 用途 | 链接 | |——|——|——| | 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子系统

关键邮件列表

主要维护者

关键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)

CO-RE (Compile Once, Run Everywhere)

原理

使用BTF (BPF Type Format)信息实现跨内核版本的可移植性。

工具

示例

// 使用BPF_CORE_READ宏读取字段
struct task_struct *task = bpf_get_current_task();
pid_t pid = BPF_CORE_READ(task, pid);

高级主题

BPF和AI/ML

BPF和内存管理

BPF和安全

社区项目

Cilium

Tetragon

Pixie

Falco

Katran

论文和研究

学术论文

| 论文 | 会议 | 年份 | |——|——|——| | 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 |

研究项目

会议和活动

eBPF Summit

LPC BPF Track

调试技巧

常用调试方法

# 查看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

常见问题

  1. 验证器失败: 检查边界条件和指针访问
  2. 加载失败: 检查内核版本和BTF支持
  3. 性能问题: 使用perf和BPF profiling工具

最新趋势 (2024-2025)

技术趋势

  1. BPF和用户空间集成: scx_rustland等用户空间调度
  2. AI/ML集成: 使用BPF优化AI工作负载
  3. 安全增强: LSM BPF, 运行时安全检测
  4. 性能优化: 验证器改进、编译器优化

生态系统

  1. 更多语言支持: Rust, Go等语言的BPF绑定
  2. 工具链成熟: libbpf, bpftool持续改进
  3. 云服务集成: AWS, GCP, Azure的BPF支持

相关链接

⚠️ 免责声明

本网站内容由 AI 工具辅助生成,仅供参考和学习使用。作者不对内容的准确性、完整性和适用性做任何保证。使用本站信息所造成的任何损失,作者不承担任何责任。请在生产环境使用前进行充分测试和验证。