libbpf-bootstrap库的代码结构介绍(用户层接口介绍),编译链接语句详细介绍,.skel.h文件介绍+示例,bpf程序的后续处理+文件关系总结

news2024/11/16 23:46:35

目录

libbpf-bootstrap

代码结构介绍

用户层函数

编译

查看

生成内核层的.o文件

第一模块

第二模块

第三模块

第四模块

第五模块

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

介绍

示例

生成代码层的.o文件

第一模块

第二模块

第三模块

链接出可执行文件

后续+总结


libbpf-bootstrap

代码结构介绍

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函数之前,先进行数组检查
  • 如果越界,内核就可以在实际执行之前拒绝它

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

.bpf.c文件 -> ebpf码 -> 加载进内核中 -> 等待被触发

                 -> skel.h头文件 -> 提供用户层接口 -> 在.c文件中被调用 -> 控制ebpf程序的执行流程   

.c文件+.skel.h文件 -> 可执行文件                                     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1595165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

舒欣上门预约系统源码-按摩预约/家政预约全行业适用-小程序/h5/app

上门预约或者到店预约均可,家政,按摩,等等上门类行业均可适用。(后台的技师及前台技师这两个字是可以更改的,例如改成家政老师,保洁,等等) 视频教程是演示搭建的小程序端&#xff0c…

stm32报错问题集锦

PS:本文负责记录本人日常遇到的报错问题,以及问题描述、原因以及解决办法等,解决办法百分百亲测有效。本篇会不定期更新,更新频率就看遇到的问题多不多了 更换工程芯片型号 问题描述 例程最开始用的芯片型号是STM32F103VE&#…

Abstract Factory抽象工厂模式详解

模式定义 提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。 代码示例 public class AbstractFactoryTest {public static void main(String[] args) {IDatabaseUtils iDatabaseUtils new OracleDataBaseUtils();IConnection connection …

微信登录功能-保姆级教学

目录 一、使用组件 二、登录功能 2.1 步骤 2.2 首先找到网页权限 复制demo 代码 这里我们需要修改两个参数 三、前端代码 3.1 api 里weiXinApi.ts 3.2 api里的 index.ts 3.3 pinia.ts 3.4 My.vue 四、后端代码 4.1 WeiXinController 4.2 Access_Token.Java 4.3 We…

SHARE 203S PRO:倾斜摄影相机在地灾救援中的应用

在地质灾害的紧急关头,救援队伍面临的首要任务是迅速而准确地掌握灾区的地理信息。这时,倾斜摄影相机成为了救援测绘的利器。SHARE 203S PRO,这款由深圳赛尔智控科技有限公司研发的五镜头倾斜摄影相机,以其卓越的性能和功能&#…

OpenHarmony实战开发-FaultLoggerd组件。

简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件,Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志,定位相关问题。 架构 Native InnerKits 接口Sig…

新手教程 | 2024年最新Vmware17安装教程及许可证(详细图文)

目录 前言: 一、VMware Workstation 17 Pro 简介 二、下载安装(以Windows为例) 三、许可证 四、检查是否安装成功 前言: 重新装电脑后,安装虚拟机 一、VMware Workstation 17 Pro 简介 VMware Workstation 17 …

问题整理【2024-04-08】

一、关于MYSQL死锁问题 1.1 源由 一次上线过程中,遇到了MySQL死锁的问题…… 1.2 分析 1.2.1 前置知识 ​ 首先要知道,MySQL是一个多线程的数据库管理系统,查询是通常并发执行的,可以同时处理多个查询请求,并且My…

文献阅读:LESS: Selecting Influential Data for Targeted Instruction Tuning

文献阅读:LESS: Selecting Influential Data for Targeted Instruction Tuning 1. 文章简介2. 方法介绍 1. Overview2. 原理说明 1. SGD上的定义2. Adam上的定义 3. 具体实现 1. Overview1. LoRA使用2. 数据选择3. LESS-T 3. 实验考察 & 结论 1. 实验设计2. 主…

SPI 设备驱动编写流程:创建SPI节点以及SPI设备节点(在设备树文件中)

一. 简介 SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动。 SPI主机控制器的驱动一般是芯片半导体厂商写好了,我们要编写的是SPI设备驱动代码。 本文开始来学习SPI设备驱动的编写流程(前提是支持设备树的情况)。 二…

Google最新论文: 复杂的 Prompt 如何更好的调试?

本文介绍了Sequence Salience,这是一个专为调试复杂的大模型提示而设计的系统。该系统利用广泛使用的显著性方法,支持文本分类和单标记预测,并将其扩展到可处理长文本的调试系统。现有的工具往往不足以处理长文本或复杂提示的调试需求。尽管存…

bugku-web-文件上传

提示他的名字是margin,给他一个图片文件,不要php文件 上传一句话木马的图片 抓包,后缀改为php 提示无效文件,即后台还会检测一次后缀 测试后台系统 为linux系统 开始绕过 截断绕过 上传成功,但是会变为jpg 开始分析…

黑马苍穹外卖--再来一单(stream流转换、赋值与收集映射)

1.首先明确一下业务规则: 业务规则: 再来一单就是将原订单中的商品重新加入到购物车中 2.产品页面原型和开发接口文档 3.业务层逻辑代码开发 3.1 查询方向 我们要明确的是: 再来一单就是将原订单中的商品重新加入到购物车中------直接把商品加入到购物车&#…

Jmeter三个常用组件

Jmeter三个常用组件 一、线程组二、 HTTP请求三、查看结果树 线程组:jmeter是基于线程来运行的,线程组主要用来管理线程的数量,线程的执行策略。 HTTP请求:HTTP请求是jmeter接口测试的核心部分,主要使用HTTP取样器来发…

微信小程序实现预约生成二维码

业务需求&#xff1a;点击预约按钮即可生成二维码凭码入校参观~ 一.创建页面 如下是博主自己写的wxml&#xff1a; <swiper indicator-dots indicator-color"white" indicator-active-color"blue" autoplay interval"2000" circular > &…

pyqt和opencv结合01:读取图像、显示

在这里插入图片描述 1 、opencv读取图像用于pyqt显示 # image cv2.imread(file_path)image cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 将图像转换为 Qt 可接受的格式height, width, channel image.shapebytes_per_line 3 * widthq_image QImage(image.data, width, hei…

2440栈的实现类型、b系列指令、汇编掉用c、c调用汇编、切换工作模式、初始化异常向量表、中断处理、

我要成为嵌入式高手之4月11日51ARM第六天&#xff01;&#xff01; ———————————————————————————— b指令 标签&#xff1a;表示这条指令的名称&#xff0c;可跳转至标签 b指令&#xff1a;相当于goto&#xff0c;可随意跳转 如&#xff1a;fini…

Finetuning vs. Prompting:大语言模型两种使用方式

目录 前言1. 对于大型语言模型的两种不同期待2. Finetune(专才)3. Prompt(通才)3.1 In-context Learning3.2 Instruction-tuning3.3 Chain of Thought(COT) Prompting3.4 用机器来找Prompt 总结参考 前言 这里和大家分享下关于大语言模型的两种使用方式&#xff0c;一种是 Fine…

Spring Boot | Spring Boot中进行 “文件上传” 和 “文件下载”

目录: 一、SpringBoot中进行 " 文件上传" :1.编写 "文件上传" 的 “表单页面”2.在全局配置文件中添加文件上传的相关配置3.进行文件上传处理&#xff0c;实现 "文件上传" 功能4.效果测试 二、SpringBoot中进行 "文件下载" :“英文名称…

geekos project3 代码记录

1.解压缩 sudo tar zxvf bochs-2.6.8.tar.gz2.进入到bochs目录 cd /home/xiongzhuo/bochs-2.6.8 3.安装bochs sudo ./configure --enable-debugger --enable-disasm遇到问题&#xff1a;解决第一个的时候卡在第二个上 configure: error: C preprocessor "/lib/cpp&quo…