# study-ebpf **Repository Path**: LingJianCode/study-ebpf ## Basic Information - **Project Name**: study-ebpf - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-29 - **Last Updated**: 2026-02-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 环境信息 `Ubuntu 24.04 Linux 6.8.0-41-generic` # Map | Map 类型 | 定位 | Key / Value | 访问方式 | 生命周期 | 性能特征 | 是否双向 | 典型使用场景 | | ------------------------- | ------ | ----------- | ----------- | ------- | --------- | ---- | --------------- | | **BPF_MAP_TYPE_HASH** | 通用状态存储 | 任意 / 任意 | 查 / 改 / 删 | 长 | 中(有锁) | ✅ | PID / IP 统计、状态表 | | **BPF_MAP_TYPE_ARRAY** | 固定索引状态 | u32 / 任意 | 直接索引 | 长 | ⭐⭐⭐⭐(最快) | ✅ | 全局计数、配置下发 | | **BPF_MAP_TYPE_LRU_HASH** | 有限状态存储 | 任意 / 任意 | 查 / 改 | 长(自动淘汰) | 中 | ✅ | 连接跟踪、防 DoS | | **BPF_MAP_TYPE_RINGBUF** | 事件通道 | ❌ / 可变 | 写 → 读(FIFO) | 短 | ⭐⭐⭐⭐⭐(最高) | ❌ |Linux ≥ 5.8, syscall / 网络事件 | > HASH / ARRAY / LRU_HASH 用来“记住现在”,RINGBUF 用来“告诉你刚刚发生了什么” # vmlinux.h 从当前运行内核的 BTF 生成,所以里面的结构体、常量、偏移量与当前内核 100% 一致,与 CO-RE(Compile Once – Run Everywhere) 完美配合,完全规避版本兼容问题。这是 eBPF 现代开发的首选方式。 # bpf2go 在 Go 项目中使用 go:generate 调用 bpf2go 工具时,命令中的 Execve(可以自定义) 是一个 自定义的 Go 包内类型前缀(或称“桩名称”,stub name),它决定了生成的 Go 代码中相关结构体、函数和变量的命名。 **如果首字母使用小写则导致包外无法调用** 小写 ```go //go:generate go run github.com/cilium/ebpf/cmd/bpf2go execve ../../ebpf/execve.bpf.c ``` 大写 ```go //go:generate go run github.com/cilium/ebpf/cmd/bpf2go Execve ../../ebpf/execve.bpf.c ``` 其他方法:` bpf2go -go-package ebpf Execve ../../ebpf/execve.bpf.c` ## clang参数 在go:generate的`--`后面的参数是传递给clang的参数 ```go // Clang 编译器扩展,使用-g 标志编译 eBPF 程序时,它会包含基于描述内核数据结构的 BTF 信息导出的 CO-RE 重定位。 GCC 编译器在12 版中也为 BPF 目标添加了 CO-RE 支持。 //go:generate go run github.com/cilium/ebpf/cmd/bpf2go Execve ../../ebpf/execve.bpf.c -- -g -O2 -Wall ``` # 网卡查看 ## 查看xdp挂载 ```bash ip -details link show dev ens33 ``` # 查看程序是否挂载tc ```bash tc filter show dev ens33 ingress ``` ## 查看bpf_printk的打印 ```c SEC("xdp") int xdp_l4(struct xdp_md *ctx) { bpf_printk("XDP packet seen\n"); return XDP_PASS; } ``` 使用上述代码能在下面命令看到`XDP packet seen`说明内核态能收到数据 ```bash sudo cat /sys/kernel/debug/tracing/trace_pipe ``` 或 ```bash sudo bpftool prog tracelog ``` # 问题 ## 卸载失败怎么办? 如果你异常退出后再次运行报错:file exists 手动清理: ``` sudo ip link set dev ens33 xdp off ```