1. 前言
搭建bpf运行环境真的是很费时间,踩过的坑也不少,今天也是因为虚拟机扩容崩了,重新安装了最新的ubuntu,bpf运行环境得以搭建完成,也算是破而后立。现在将bpf运行环境搭建和bpf纯c代码的编写和运行过程进行分享。
2. 搭建bpf程序运行环境
2.1 下载源码
无论用什么方式下载都可以,apt下载,git clone 或者windows上下载好复制过来都可,将源码解压在/usr/src/目录下,我的Linux源码和系统一致,都是5.4的。

2.2 安装依赖
apt install libncurses5-dev flex bison libelf-dev binutils-dev libssl-dev
使用以下两条命令分别安装 clang 和 llvm
apt install clang
apt install llvm
安装成功的标志如下:

2.3 配置内核
在源码根目录下使用make defconfig生成.config文件,可以执行make menuconfig来可视化的查看内核配置选项。
2.4 关联内核头文件
make headers_install
3. bpf代码分析及运行
3.1 编译内核bpf样例
在源代码根目录下执行make M=samples/bpf,可以在samples/bpf/文件夹中看到已经生成了bpf的可执行文件
3.2 自己编写bpf程序
编写自己的bpf程序,只需要在samples/bpf/文件夹中编写hello_kern.c,hello_user.c以及修改Makefile即可,最后在源代码根目录下执行make M=samples/bpf,就可以在samples/bpf/文件夹中看到自己的bpf程序生成了可执行文件。
3.2.1 第一步,编写hello_kern.c文件
#include <linux/bpf.h>
#include "bpf_helpers.h"
#define SEC(NAME) __attribute__((section(NAME), used))
SEC("tracepoint/syscalls/sys_enter_execve")
int bpf_prog(void *ctx){
char msg[] = "JinRong's first bpf program!\n";
bpf_trace_printk(msg, sizeof(msg));
return 0;
}
char _license[] SEC("license") = "GPL";
3.2.2 第二步,编写hello_user.c文件
#include <stdio.h>
#include "bpf_load.h"
int main(int argc, char **argv){
if(load_bpf_file("hello_kern.o")!=0){
printf("The kernel didn't load BPF program\n");
return -1;
}
read_trace_pipe();
return 0;
}
3.2.3 第三步,修改Makefile文件
我们修改Makefile时只需要修改三处,分别在对应的位置添加hostprogs-y += hellohostprogs-y += hello,hello-objs := bpf_load.o hello_user.o和always += hello_kern.o,修改后的完整的Makefile文件如下:
# SPDX-License-Identifier: GPL-2.0
BPF_SAMPLES_PATH ?= $(abspath $(srctree)/$(src))
TOOLS_PATH := $(BPF_SAMPLES_PATH)/../../tools
# List of programs to build
hostprogs-y := test_lru_dist
hostprogs-y += sock_example
hostprogs-y += fds_example
hostprogs-y += sockex1
hostprogs-y += sockex2
hostprogs-y += sockex3
hostprogs-y += tracex1
hostprogs-y += tracex2
hostprogs-y += tracex3
hostprogs-y += tracex4
hostprogs-y += tracex5
hostprogs-y += tracex6
hostprogs-y += tracex7
hostprogs-y += test_probe_write_user
hostprogs-y += trace_output
hostprogs-y += lathist
hostprogs-y += offwaketime
hostprogs-y += spintest
hostprogs-y

本文详细介绍了如何在Ubuntu上搭建BPF运行环境,包括源码下载、依赖安装、内核配置,以及如何编写并运行纯C的BPF程序,包括hello_kern.c和hello_user.c的示例。
最低0.47元/天 解锁文章
1137





