Ubuntu下bpf纯c程序的编写与运行

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

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 += hellohello-objs := bpf_load.o hello_user.oalways += 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 
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值