news 2026/4/27 7:03:54

零基础快速开发eBPF程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零基础快速开发eBPF程序

eBPF(extended Berkeley Packet Filter)是Linux内核中的一项革命性技术,允许开发者在不修改内核源码的情况下安全运行沙盒化程序。对于零基础开发者,使用BCC框架是最简单的入门方式。以下是详细的开发步骤:

一、环境准备

  1. 系统要求
  • Linux内核版本4.1+(推荐5.15+或6.2+)
  • Ubuntu 20.04或更新版本(或类似发行版)
  1. 安装必要工具
sudo apt update sudo apt install -y git build-essential libelf-dev zlib1g-dev llvm clang
  1. 安装BCC工具集
sudo apt install -y bcc-tools libbcc-examples

提示:BCC是BPF编译器集合,提供了Python接口,简化了eBPF开发流程。

二、开发第一个eBPF程序

步骤1:编写eBPF程序(hello.c)

创建一个名为​​hello.c​​的文件,输入以下内容:

#include <linux/bpf.h> #include <bpf/bpf_helpers.h> int hello_world(void *ctx) { bpf_trace_printk("Hello, World!"); return 0; }

关键说明

  • ​bpf_trace_printk()​​是eBPF中常用的辅助函数,用于输出调试信息
  • 与普通程序不同,eBPF程序输出到内核调试文件​​/sys/kernel/debug/tracing/trace_pipe​

步骤2:编写用户态程序(hello.py)

创建一个名为​​hello.py​​的文件,输入以下内容:

#!/usr/bin/env python3 from bcc import BPF # 1) 加载BPF程序 b = BPF(src_file="hello.c") # 2) 挂载kprobe到系统调用openat2 b.attach_kprobe(event="do_sys_openat2", fn_name="hello_world") # 3) 读取并打印内核调试输出 print("Tracing... Hit Ctrl+C to end.") b.trace_print()

关键说明

  • ​BPF(src_file="hello.c")​​加载eBPF程序
  • ​attach_kprobe()​​将程序挂载到内核探针(kprobe)
  • ​trace_print()​​读取并打印内核调试输出

步骤3:运行程序

sudo python3 hello.py

程序开始运行后,每当有进程调用​​openat2​​系统调用(如打开文件),就会在终端输出"Hello, World!"。

三、理解工作原理

  1. BCC的作用:BCC将eBPF程序的编译、加载和管理过程抽象化,提供Python接口
  2. eBPF执行流程
  • BCC调用LLVM将C代码编译为BPF字节码
  • 将字节码加载到内核中
  • 通过kprobe等机制触发执行
  • 输出结果通过​​/sys/kernel/debug/tracing/trace_pipe​​返回

四、进阶实践

1. 监控系统调用

修改​​hello.c​​,添加系统调用监控功能:

#include <linux/bpf.h> #include <bpf/bpf_helpers.h> #include <linux/ptrace.h> #include <linux/sched.h> BPF_HASH(counts, u32, u64); int trace_sys_enter(void *ctx) { u32 pid = bpf_get_current_pid_tgid() >> 32; u64 zero = 0, *p; p = counts.lookup_or_init(&pid, &zero); (*p)++; return 0; }

2. 运行监控程序

from bcc import BPF b = BPF(text=""" #include <linux/bpf.h> #include <bpf/bpf_helpers.h> #include <linux/ptrace.h> #include <linux/sched.h> BPF_HASH(counts, u32, u64); int trace_sys_enter(void *ctx) { u32 pid = bpf_get_current_pid_tgid() >> 32; u64 zero = 0, *p; p = counts.lookup_or_init(&pid, &zero); (*p)++; return 0; } """) b.attach_kprobe(event="sys_enter", fn_name="trace_sys_enter") while True: try: for k, v in b["counts"].items(): print("PID {}: {}".format(k.value, v.value)) b["counts"].clear() sleep(2) except KeyboardInterrupt: exit()

五、实用技巧与注意事项

  1. 调试技巧
  • 使用​​bpftool​​​查看eBPF程序状态:​​bpftool prog list​
  • 查看内核日志:​​dmesg | tail​
  1. 性能优化
  • eBPF程序指令数限制(约4096条)
  • 避免在循环中进行复杂操作
  1. 安全考虑
  • 确保eBPF程序不会影响系统稳定性
  • 在测试环境中先验证程序
  1. 学习路径建议
  • 初学者:理解基本概念,运行示例程序
  • 进阶:学习编写自定义程序,探索网络、安全、性能监控等场景
  • 高级:使用libbpf框架,实现更复杂的eBPF应用

六、常见问题

Q:eBPF程序在哪里运行?A:在Linux内核的虚拟机中运行,确保了安全性和性能。

Q:需要哪些前置知识?A:基本的Linux系统知识、C语言编程经验。

Q:为什么我的程序没有输出?A:检查内核调试文件​​/sys/kernel/debug/tracing/trace_pipe​​,确保已正确挂载kprobe。

通过以上步骤,你已成功开发并运行了第一个eBPF程序。eBPF技术在系统监控、网络分析、安全防护等领域有广泛应用,掌握这项技术将为你的系统编程能力带来质的飞跃。建议从简单的监控程序开始,逐步探索更复杂的场景。记住,eBPF的核心优势在于其安全性和灵活性,让你能够在不修改内核的情况下扩展系统功能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 7:02:22

使用CNN实现MNIST手写数字识别:从原理到实践

1. 手写数字识别与CNN基础MNIST手写数字数据集堪称计算机视觉领域的"Hello World"。这个包含6万张训练图像和1万张测试图像的数据集&#xff0c;每张都是28x28像素的灰度手写数字(0-9)。2000年初&#xff0c;研究者们用传统机器学习方法(如SVM)在这个数据集上最高能达…

作者头像 李华
网站建设 2026/4/27 7:01:20

基于MCP协议实现Cursor AI与Figma设计稿的智能集成与自动化

1. 项目概述&#xff1a;当AI代码助手遇见设计工具如果你和我一样&#xff0c;既是开发者&#xff0c;又时常需要和设计师协作&#xff0c;那你肯定遇到过这样的场景&#xff1a;设计师在Figma里更新了一个按钮的圆角&#xff0c;或者调整了某个组件的间距&#xff0c;然后你得…

作者头像 李华
网站建设 2026/4/27 6:56:25

AI智能体如何重塑软件开发?复旦Agent4SE论文列表全解析

1. 项目概述&#xff1a;一份面向软件工程智能体的学术地图如果你正在关注软件工程&#xff08;Software Engineering, SE&#xff09;与人工智能&#xff08;AI&#xff09;的交叉领域&#xff0c;特别是“智能体”&#xff08;Agent&#xff09;如何重塑软件开发的全过程&…

作者头像 李华
网站建设 2026/4/27 6:50:57

RoboNeuron:LLM代理与机器人中间件的智能桥梁

1. RoboNeuron&#xff1a;连接LLM代理与机器人中间件的桥梁在具身智能&#xff08;Embodied AI&#xff09;领域&#xff0c;我们正面临一个有趣的矛盾&#xff1a;一方面&#xff0c;视觉-语言-动作&#xff08;VLA&#xff09;模型和LLM代理在语言理解、视觉感知和动作生成方…

作者头像 李华
网站建设 2026/4/27 6:50:51

软件工程智能体学术地图:从入门到前沿的论文清单指南

1. 项目概述&#xff1a;一份面向软件工程智能体的学术地图如果你正在关注软件工程与人工智能的交叉领域&#xff0c;尤其是“智能体”如何重塑软件开发流程&#xff0c;那么你很可能已经感受到了信息过载的困扰。每天都有新的论文、新的框架、新的评测基准涌现&#xff0c;从代…

作者头像 李华
网站建设 2026/4/27 6:50:01

LSTM实现随机整数回显:时序数据处理入门实战

1. 项目背景与核心目标在时序数据处理领域&#xff0c;LSTM&#xff08;长短期记忆网络&#xff09;因其优秀的记忆能力而广受青睐。这个项目的核心目标看似简单——让LSTM学会随机整数的回显&#xff08;Echo&#xff09;&#xff0c;但背后却蕴含着序列学习的基础原理验证。想…

作者头像 李华