当前位置: 首页 > news >正文

最基础的 eBPF 示例程序 - Hello World

最基础的 eBPF 示例程序 - Hello World

这是一个最简单的 eBPF 程序,它会在每次execve系统调用时打印一条消息。

一、完整示例代码

1.1 eBPF 内核程序 (hello.bpf.c)

// hello.bpf.c - 最基础的 eBPF Hello World#include<linux/bpf.h>#include<bpf/bpf_helpers.h>// 必须的许可证声明charLICENSE[]SEC("license")="GPL";// 定义一个简单的 tracepoint 程序SEC("tracepoint/syscalls/sys_enter_execve")inthello_world(void*ctx){bpf_printk("Hello, eBPF World! PID: %d\n",bpf_get_current_pid_tgid()>>32);return0;}

1.2 用户态加载程序 (hello.c)

// hello.c - 使用 libbpf 加载 eBPF 程序#include<stdio.h>#include<unistd.h>#include<bpf/libbpf.h>#include<bpf/bpf.h>intmain(intargc,char**argv){structbpf_object*obj;structbpf_program*prog;intprog_fd;// 打开 eBPF 对象文件obj=bpf_object__open_file("hello.bpf.o",NULL);if(libbpf_get_error(obj)){fprintf(stderr,"Failed to open BPF object\n");return1;}// 加载 eBPF 程序到内核if(bpf_object__load(obj)){fprintf(stderr,"Failed to load BPF object\n");return1;}// 查找 tracepoint 程序prog=bpf_object__find_program_by_name(obj,"hello_world");if(!prog){fprintf(stderr,"Failed to find BPF program\n");return1;}// 获取程序文件描述符prog_fd=bpf_program__fd(prog);if(prog_fd<0){fprintf(stderr,"Failed to get program FD\n");return1;}// 附加到 tracepointstructbpf_link*link=bpf_program__attach_tracepoint(prog,"syscalls","sys_enter_execve");if(libbpf_get_error(link)){fprintf(stderr,"Failed to attach tracepoint\n");return1;}printf("eBPF program attached! Run some commands and check /sys/kernel/debug/tracing/trace_pipe\n");printf("Press Ctrl+C to exit\n");// 等待用户中断while(1){sleep(1);}// 清理bpf_link__destroy(link);bpf_object__close(obj);return0;}

1.3 Makefile

# Makefile CLANG ?= clang BPF_CFLAGS = -target bpf -g -O2 -Wall all: hello # 编译 eBPF 字节码 hello.bpf.o: hello.bpf.c $(CLANG) $(BPF_CFLAGS) -c $< -o $@ # 编译用户态程序 hello: hello.c hello.bpf.o gcc -g -O2 -Wall -o hello hello.c -lbpf -lelf -lz clean: rm -f hello.bpf.o hello run: all sudo ./hello .PHONY: all clean run

二、编译和运行

# 1. 编译make# 2. 运行(需要 root 权限)sudo./hello# 3. 在另一个终端执行一些命令lspscat/etc/passwd# 4. 查看 eBPF 输出sudocat/sys/kernel/debug/tracing/trace_pipe

三、更简单的版本:使用 bpftrace

如果不想写 C 代码,可以用 bpftrace 实现同样的功能:

# 安装 bpftracesudoaptinstallbpftrace# 一行命令的 Hello Worldsudobpftrace-e'tracepoint:syscalls:sys_enter_execve { printf("Hello from %s (PID %d)\n", comm, pid); }'# 或者保存为脚本文件 hello.btcat>hello.bt<<'EOF' #!/usr/bin/bpftrace tracepoint:syscalls:sys_enter_execve { printf("Hello from %s (PID %d)\n", comm, pid); } EOFchmod+x hello.btsudo./hello.bt

四、代码解释

4.1 eBPF 程序部分

  • SEC("tracepoint/..."):指定程序类型(这里是 tracepoint)
  • bpf_printk():最简单的输出函数,写入/sys/kernel/debug/tracing/trace_pipe
  • bpf_get_current_pid_tgid():获取当前进程 PID

4.2 用户态部分

  • bpf_object__open_file():打开编译好的 eBPF 字节码
  • bpf_object__load():将 eBPF 程序加载到内核
  • bpf_program__attach_tracepoint():挂载到指定 tracepoint

五、预期输出

在运行程序后,执行一些命令,你会看到类似输出:

$sudocat/sys/kernel/debug/tracing/trace_pipe<...>-12345[000]....123456.789012: 0x00000001: Hello, eBPF World!PID:12345bash-12346[001]....123457.890123: 0x00000001: Hello, eBPF World!PID:12346ls-12347[002]....123458.901234: 0x00000001: Hello, eBPF World!PID:12347

六、这个示例展示了什么?

特性说明
最基本的 eBPF 程序只有几行代码
编译流程从 C 到 BPF 字节码
加载机制用户态程序加载 eBPF
挂载点挂载到 tracepoint
数据输出使用bpf_printk
完整工具链编译、运行、查看结果

这就是 eBPF 的 Hello World,它展示了 eBPF 程序的基本结构、编译方法和运行机制。从此出发,可以扩展到更复杂的 kprobe、uprobe、XDP 等程序类型。

http://www.jsqmd.com/news/470270/

相关文章:

  • 机器人(AGV\AMR,机器狗)自动乘梯(梯控)开门(门禁又称为门控)还能加装人脸二维码刷卡识别吗?智能梯控系统通过统一主板实现电梯、门禁等设备的高效联动,采用模块化设计与物理逻辑隔离,确保安全与高效
  • 2026年知名的药厂气动物流传输系统品牌推荐:畜牧业气动物流传输系统/大连医用气动物流传输系统厂家推荐与采购指南 - 品牌宣传支持者
  • Kali与渗透测试基础
  • 2026年新疆栢顿沙发品牌推荐:栢顿家居/栢顿家居餐厅家具厂家汇总与采购指南 - 品牌宣传支持者
  • 解决超微 SuperMicro 主板风扇反复高低转速问题
  • 2026年质量好的建筑业样品检验化验传输系统品牌推荐:轮胎厂样品检验化验传输系统高口碑厂家推荐(评价高) - 品牌宣传支持者
  • 2026年口碑好的留学公司推荐:航空留学/四川航空留学优选合作机构 - 品牌宣传支持者
  • GEDFFWE[麦麦茶水间] 【每周分享】沁恒CH592F开发中遇到的ADC采样不准及解决方案
  • 从零构建企业级网页搜索:Elastic Open Crawler 架构解析与实战部署
  • 2026年热门的滑冰场设备品牌推荐:滑冰场管材优质供应商推荐参考 - 品牌宣传支持者
  • 游戏闪退/软件打不开?这款DirectX修复工具,一键搞定DLL文件缺失!
  • day10 126-130
  • 2026年评价高的地坪漆厂家推荐:水性地坪漆/车库地坪漆高评价厂家推荐 - 品牌宣传支持者
  • 抓只小龙虾来养养
  • springboot基于javaEE 学生成绩管理系统
  • 从一块电路板到宇宙的结构:一次关于碳族元素与存在本质的漫游
  • 2026年质量好的特医功能食品工厂品牌推荐:特医功能食品工厂品牌榜 - 品牌宣传支持者
  • 2026年比较好的昆山0元注册公司推荐:昆山公司代办注册/昆山花桥注册公司精选服务企业 - 品牌宣传支持者
  • 一次揪心的ITX主板维修:Cmos电池漏电快
  • 掌握大数据领域数据清洗,开启数据新征程
  • 2026年质量好的厂房维修品牌推荐:浙江厂房维修值得信赖榜 - 品牌宣传支持者
  • (132页PPT)SAP汽车制造企业ERP蓝图规划整体解决方案(附下载方式)
  • (132页PPT)汽车智能制造企业数字化转型SAP解决方案(附下载方式)
  • PyTorch数据加载器超快
  • Python 中的并发 —— 线程
  • 2026年热门的河北冶金膨润土厂家推荐:河北铸造膨润土实力工厂推荐 - 品牌宣传支持者
  • 2026年比较好的石英砂工厂推荐:精制石英砂工厂直供推荐 - 品牌宣传支持者
  • 2026年热门的裁剪机切割系统品牌推荐:江苏智能裁剪机正规生产厂家推荐 - 品牌宣传支持者
  • 2026年热门的进口烧烤椰壳炭公司推荐:马来西亚椰壳炭公司口碑哪家靠谱 - 品牌宣传支持者
  • 2026年耐热纤维龙门裁断机厂家推荐:液压裁断机/自动送料裁断机/移动头式裁断机厂家实力哪家强 - 品牌宣传支持者