bpf,ebpf,libbpf,libbpf_bootstarp概念介绍(如何安装libbpf_bootstarp库),以及四者关系,ebpf程序执行流程(代码分层,具体如何编译,后续操作,关系总结)

news/2024/5/17 7:50:53

目录

概念介绍

bpf

​编辑

ebpf

eBPF 虚拟机

libbpf 

libbpf-bootstrap

如何安装

源码目录 

ebpf, libbpf 和libbpf-bootstrap之间的关系

ebfp程序数据流程

介绍

代码

用户层函数

编译

查看

生成内核层的.o文件

第一模块

第二模块

第三模块

第四模块

第五模块

生成辅助文件(.skel.h)

生成代码层的.o文件

第一模块

第二模块

第三模块

链接出可执行文件

后续+总结


本文参考哔哩哔哩up主"张口就问"发布的ebpf的学习视频,感谢大佬

概念介绍

bpf

ebpf

  • 它提供了一个功能强大的虚拟机,在内核中执行用户定义的程序
  • 通过 eBPF,用户可以编写并在内核中动态加载运行自定义的程序,而无需修改/重新编译内核源代码,从而实现了一种灵活而安全的内核扩展方式

eBPF 虚拟机

  • 用户编写的 eBPF 程序以字节码的形式加载到内核中,并由 eBPF 虚拟机执行
  • 通过特定的用户态工具或接口,将eBPF程序加载到内核中的特定区域,并在不再需要时将其从内核中移除
  • 我理解的他们之间的关系也许是:
  • 这样各是各的,互不影响

libbpf 

对bpf syscall(系统调用) 做出了基础封装,提供了 open, load, attach, maps操作, CO-RE等功能

libbpf-bootstrap

基于 libbpf 开发出来的eBPF内核层代码,通过bpftool工具直接生成用户层代码操作接口,极大减少开发人员的工作量

如何安装

首先需要linux环境+11版本及以上的clang编译器

  • 最好使用ubuntu环境,centos提供的软件包版本太低了
  • ubuntu可以指定安装clang版本(注意更新一下软件包,但默认还是下载的clang10),但centos好像需要自己下载源码编译

然后根据libbpf-bootstrap 开发指南:概念与如何安装-CSDN博客进行环境搭建即可

源码目录 

 

ebpf, libbpf 和libbpf-bootstrap之间的关系

类似于在c语言中的系统调用,c库,第三方库之间的关系

  • ebpf 提供底层接口,让用户程序可以在内核中动态执行
  • 而libbpf 是用户态的c库,它对ebpf程序的接口和函数进行了封装,减少了我们的使用成本
  • libbpf-bootstrap 是一个辅助工具和示例代码集合,他是使用者自己开发的一种工具,帮助我们更好地使用libbpf

ebfp程序数据流程

介绍

代码

ebpf代码一般分为两个部分,用户层代码(.c)和内核层代码(.bpf.c)

  • 内核层代码:跑在内核层,负责实现真正的eBPF功能(也就是核心功能代码)
  • 用户层代码:跑在用户层,负责 open, load, attach eBPF内核层代码到内核,并负责用户层和内核层的数据交互

用户层函数

  • 注意,在用户层写的代码中,我们使用的核心函数其实是经过了进一步封装的:
  • 他们的函数名第一个都是程序名,这么自定义的行为说明底层绝对是调用了其他函数,但我们在使用时并不需要关心,因为肯定是库自发性的行为
  • (当然啦,学习的时候还是要懂原理的,将在下面的编译里介绍)

编译

查看

我们可以通过现成的makefile来查看编译时的具体语句:

make kprobe V=1

生成内核层的.o文件

我们先看生成了内核层的.o文件的编译语句:

clang -g -O2 -target bpf -D__TARGET_ARCH_x86   -I.output 
-I../../libbpf/include/uapi 
-I../../vmlinux/x86/ 
-I/libbpf-bootstrap/blazesym/capi/include -idirafter /usr/local/include 
-idirafter /usr/lib/llvm-11/lib/clang/11.0.0/include 
-idirafter /usr/include/x86_64-linux-gnu 
-idirafter /usr/include                -c kprobe.bpf.c -o .output/kprobe.tmp.bpf.o/libbpf-bootstrap/examples/c/.output/bpftool/bootstrap/bpftool
gen object 
.output/kprobe.bpf.o .output/kprobe.tmp.bpf.o

我们把这里的编译语句分为五部分:

第一模块

基本信息+功能选项

第二模块

添加libbpf-bootstrap库中的文件到搜索路径中

第三模块

添加系统库文件到搜索路径中

  • -I和-idirafter的区别:
第四模块

指定要生成的目标文件

第五模块

使用bptool工具生成两份bpf.o文件(编译成 eBPF 字节码,字节码用elf格式存储)

  • 一份用于生成辅助文件,以及加载到内核中
  • 一份备份文件 
  • (根据实际语句理解的,应该是这样)

生成辅助文件(.skel.h)

/libbpf-bootstrap/examples/c/.output/bpftool/bootstrap/bpftool 
gen skeleton 
.output/kprobe.bpf.o > .output/kprobe.skel.h

还记得前面说的,用户层使用的函数其实是再次经过封装的吗?

  • 由bpftool工具自动帮我们根据.bpf.o来生成.skel.h头文件的
  • 根据实际要在内核中执行的功能,根据执行过程需要的函数,生成一份用户层和内核层的中间文件
  • 它提供了用户层的接口,并且自动在里面封装出可以执行内核层代码的代码
  • 官方一点就是它里面包含了.bpf.c 对应的elf文件数据,以及用户层需要的 open, load, attach 等接口

  • 就像这样,他帮我们自动生成用户层接口,并在里面调用所需的libbpf中的函数,并进行一定处理:
  • 这个更是如此,甚至将两个函数合在一块,方便我们使用:
  • 如果追根溯源的话,更能体现它会根据内核层代码,建立中间要使用的数据结构,生成中间代码,生成用户层接口:
  • 让我们一起说,谢谢它!!! 

生成代码层的.o文件

cc -g -Wall -I.output 
-I../../libbpf/include/uapi 
-I../../vmlinux/x86/ 
-I/libbpf-bootstrap/blazesym/capi/include -c kprobe.c -o .output/kprobe.o

和内核层的类似,我们可以把它分成三部分:

第一模块

普通选项

第二模块

添加搜索路径

  • 添加.output是因为,有生成的.skel.h头文件在那个目录下
  • 我们必须加上实际的库函数,才能编译成功
第三模块

指定目标文件名

链接出可执行文件

cc -g -Wall .output/kprobe.o 
/libbpf-bootstrap/examples/c/.output/libbpf.a   
-lelf 
-lz -o kprobe

后续+总结

可以看到,用户层代码.o文件+库文件最终链接出了可执行文件

那.bpf.o呢?

我是这么理解的 :

用户层代码用于管理ebpf程序的执行(启动啦,挂接啦,销毁啦等等)

而内核层代码只负责编写挂接后的操作(或者说核心操作),然后被加载到内核中,等待被触发:

  • 可以看到,在libbpf库中,提供了一系列函数,用于将ebpf码传进系统调用函数中
  • 也就说,.bpf.o并不在可执行文件里,而是被加载进了内核里,由可执行文件远程控制它的生命周期
  • 然后就等待其被触发

并且经过一系列安全检查,保证这份程序被加载进内核前是安全的:

  • 这个安全检查是利用了ebpf的特性编写的
  • 在进入vts_write函数之前,先进行数组检查
  • 如果越界,内核就可以在实际执行之前拒绝它

总之,它形成了一系列的关系:

内核层代码 -> ebpf码 -> 加载进内核中(用户空间程序调用系统调用,将ebpf码作为参数传入)

                   -> elf.h头文件 -> 提供用户层接口 -> 控制ebpf程序的执行流程                                         


http://www.mrgr.cn/p/87571508

相关文章

项目绩效域

项目绩效域概述价值驱动的项目管理知识体系关注价值的实现,包含了项目管理原则、绩效域、项目生命周期、工程组、10大知识领域和价值交付系统。在整个生命周期中,项目管理者通过涵盖10大知识领域的项目管理工程组对项目进行管理,同时需要密切关注干系人、团队、开发方法和生…

Happus:给准备离职成为独立开发者的你 5 点建议

名字:Happus 开发者 / 团队:Regina Dan 平台:iOS, visionOS请简要介绍下这款产品 Happus 是你追寻幸福健康关系、甚至提高婚姻生活品质的贴心助手。无论是关系维系、情侣问答、聊天话题、趣味事实、生活窍门、休闲游戏,还是约会灵感,App 中的一切都希望让你们成为更加幸福…

电脑安装双系统windows和ubuntu server

1.创建Ubuntu-server的启动盘 首先要从官网下载Ubuntu-server18.04的ISO文件,用rufs烧录到U盘。如下所示 2. 磁盘分区 在windows创建两个盘(linuxboot 和linuxroot),后面一个一个用于boot,一个用于root. 3.开机U盘启…

macos下 jupyter服务安装和vscode链接密码设置 .ipynb文件

最近收到了一些后缀为.ipynb的文件, 这个文件就是使用jupyter编辑的,于是就需要安装一个jupyter服务, 对于最新版本的jupyter 网上很多的资料都已经过期了,这里以最新版本的jupyter为例。 jupyter lab安装 jupyter 这个工具包含…

介绍部署esxi8.0产品的方式

什么是esxi esxi的中文叫裸机虚拟机管理器 ESXi是由VMware公司开发的一种裸机虚拟机管理器,全称为VMware ESXi。 ESXi是一种虚拟化技术,专门设计用于在物理服务器上运行虚拟机,它的主要特点是能够最大限度地降低硬件配置要求并简化部署过程…

2017蓝桥杯省赛b组

2017蓝桥杯省赛b组#include<bits/stdc++.h> using namespace std; //用一个map,存放余数,和同余数的前缀和 typedef long long int ll; map<int,vector<ll>>p; int main(){ int n,k;//n个数, cin>>n>>k; ll cnt=0; ll sum=0;//前缀和 int a; …

计算机票.java

题目&#xff1a;机票价格按照淡季旺季&#xff0c;头等舱和经济舱收费&#xff0c;输入机票原价&#xff0c;月份&#xff0c;头等舱或经济舱 。按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱九折&#xff0c;经济舱8.5折&#xff0c;淡季&a…

CF494C Helping People

\(CF494C\ \ Helping People\) 题目描述 给一个序列 \(a_1,a_2,a_3,\dots a_n\) 和 \(m\) 次操作,每次可将区间 \([a_i,b_i]\) 加上 \(1\) ,操作成功的概率是 \(p_i\) ,求最后序列中最大值的期望。对于两个区间 \([a,b],[c,d]\) ,保证 以下条件之一成立:这两个段完全不相交…

nexus 代理 yum 源

环境说明服务 ip 端口 备注nexus 192.168.80.129 (内网) 8081 内网地址无法访问外网nginx192.168.80.128 (内网) 192.168.174.126 (外网)19000 192.168.174.126 地址可以访问外网创建 Blob Stores创建 Repositoriesnginx 配置 server {listen 19000;server_name localho…

Digital Image processing (DIP)

Camera FOV: Filed of view DOV: deep of view 景深 被F f/D 衡量&#xff0c;f 是焦距&#xff0c;D 是光圈大小。 当确定好了景深后&#xff0c;如何光线较暗&#xff0c;则需要补光&#xff0c;或者适当延长曝光时间&#xff08;快门&#xff09; 分辨率、像素尺寸&…

如何在极狐GitLab 自定义 Pages 域名、SSL/TLS 证书

本文作者:徐晓伟GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户自定义 Pages 域名、SSL/TLS 域名证…

Docker Runc容器逃逸漏洞(CVE-2021-30465) 离线修复

Docker Runc容器逃逸漏洞(CVE-2021-30465) 离线修复 漏洞描述 漏洞名称:runc 路径遍历漏洞 影响版本:runc <= 1.0.0-rc94 修复建议: 将 runc 升级到最新版本,优先通过操作系统包管理器安装新版本进行漏洞修复。 如果采取替换runc二进制文件进行漏洞修复,针对不同的操作系…

记录关于智能家居的路程的一个bug___Segmentation fault(段错误)

前言 其实发生段错误的情况有很多&#xff1a; 其实在项目的开发中最有可能的错误就是①和②&#xff0c;考虑到本项目数组用的比较少&#xff0c;所以主要是考虑错误①指针的误用。 有时候错误就是那么离谱&#xff0c;声音也算是一种设备&#xff1f;&#xff1f;&#xff…

云计算与 AI 融合:Amazon Connect 开创客户服务智能时代

在亚马逊云科技 re:Invent 2023 大会上,Amazon Connect 引入生成式人工智能功能,标志着客户服务迎来了智能化的新时代。云计算作为提供弹性、可靠、高效服务的基础,与人工智能的融合为客户服务注入了新的活力。这次推出的新功能不仅仅是技术的结合,更是对客户服务进行全方位…

Vue 二次封装组件的艺术与实践

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

鸿蒙雄起!风口就在当下,你如何抉择?

近年来&#xff0c;华为自主研发的鸿蒙操作系统&#xff08;HarmonyOS&#xff09;引起了广泛的关注和讨论。鸿蒙系统不仅标志着华为在软件领域的一次重大突破&#xff0c;也预示着全球智能设备市场格局的潜在变化。本文将深入探讨鸿蒙系统的兴起、其在市场上的表现以及对程序员…