BPF技术学习分享

article/2025/9/19 23:17:51

什么是BPF程序:

BPF is a highly flexible and efficient virtual machine-like construct in the Linux kernel allowing to execute bytecode at various hook points in a safe manner.

  1. BPF程序 ----LLVM+Clang----> BPF字节码 ----JIT----> BPF指令集;
  2. BPF架构采用一种新的虚拟机设计,包含支持x86_64, arm64, mips64等架构的指令集,BPF指令集程序可以高效地工作在基于寄存器架构(r0到r10)的CPU上;
  3. Linux内核维护者不断开发hook点,可以在hook点上挂载BPF程序,当hook点对应的事件发生就可以执行BPF程序,BPF程序返回hook点预定义的值,Linux内核再根据返回值执行下一步操作(比如XDP类型的BPF程序挂载在指定的网络接口上,有数据包进入该网络接口,BPF程序对数据包进行解析然后根据协议字段进行判断,如果不符合规则就返回XDP_DROP,Linux内核根据该返回值就会丢弃该数据包)。

image.png

BPF工作原理:

image.png

C语言编写的BPF程序经过LLVM+Clang编译生成BPF字节码文件(ELF文件),通过bpf()系统调用加载到内核,进入到内核首先经过BPF验证器(检查程序是否不包含控制循环、程序不会执行超过内核允许的最大指令数等),再经过即时编译器将BPF字节码转换成BPF在x86_64 CPU架构上的指令集,并挂载到Socket send/recv类型的hook点,也就是说当进程执行sendmsg()/recvmsg()系统调用都会执行BPF程序,BPF程序可以检查消息内容并决定是丢弃该消息还是将消息向下传递或者是直接转发给另外一个socket。

BPF关键组件:

  • BPF Hooks

image.png

  • BPF映射:
  1. BPF程序和用户空间程序通过BPF映射通信;
  2. BPF映射以键/值保存在内核,可以被任何BPF程序访问,用户空间的程序可以通过文件描述符访问BPF映射
  3. BPF映射类型:BPF映射支持多种数据结构,从而实现内核内部数据的组织以及用户态和内核态的通信,比如哈希表、数组、队列等等

image.png

  1. BPF映射用途举例:
    1)在BPF程序不中断的情况下修改其运行方式,修改映射中BPF程序访问的配置数据或应用数据,例如黑名单规定的IP列表和域名;
    2)运行在内核的BPF程序统计进入指定网络接口的数据包信息,并将统计信息保存到BPF映射,用户态程序可以通过BPF映射获取数据包统计信息;

image.png

  • BPF辅助函数(BPF Helper Function):如其他语言生态会提供丰富的库提供大量的API函数,BPF也包含各种常用的辅助函数,提供操作内核数据和BPF映射的工具类函数;
  1. 优点:通过定义和维护BPF辅助函数,由BPF辅助函数维护者处理Linux内核版本的迭代更新,对开发者透明,形成稳定的API接口;
  2. BPF辅助函数列表:

image.png

XDP BPF程序栗子:

示例一:

image

这段程序的功能:丢弃所有源IP命中黑名单的ARP包。

图中首先定义了一个BPF映射(可以在内核和用户态之间传递数据)作为数据包黑名单,它的类型是BPF_MAP_TYPE_HASH(哈希表数据结构),key值定义为IP地址,value值定义为1,哈希表最大键值对数为100000,BPF映射中的内容是由用户态程序预定义的。右边通过SEC语句声明了一个BPF程序,右侧四个框的功能为:

  1. 初始化以太帧结构体;

  2. 如果不是ARP数据包,返回XDP_PASS,数据包将会交给内核继续处理,如进入网络协议栈;

  3. 如果是ARP数据包,解析获得源IP地址,通过 value = bpf_map_lookup_elem(&blacklist, &ip_src);BPF辅助函数访问BPF映射,根据ip地址查询对应的值,

    a) 如果存在该IP地址,返回值为1,将返回XDP_DROP,数据包将被丢弃;
    b) 如果不存在该IP地址,返回值为0,将返回XDP_PASS,数据包将会交给内核继续处理;

示例二

参考:xdp-tutorial

image.png

image.png

判断icmps报文顺序号是否为奇数,如果为奇数返回1,偶数返回0,如果是偶数将返回XDP_DROP。

环境准备:image.png

image.png

image.png

image.png

执行make命令将BPF C源文件编译成BPF字节码文件:

image.png

将BPF程序挂载到package网络接口,当package网络接口接收到数据包将执行该BPF程序:

image.png

在veth0接口上通过ping命令向package网络接口发送icmp数据包,可以观察到icmp顺序号为偶数的数据包被丢弃:

image.png

  • 总结:

切入口:XDP、TC、Socket类型的BPF程序—>读懂Cilium BPF代码;


http://chatgpt.dhexx.cn/article/tnv1AqFX.shtml

相关文章

BPF之事件源

基础 1. BPF和eBPF概念 BPF 原是 Berkeley Packet Filter(伯克利数据包过滤器)的缩写,1992诞生,用于网络包过滤。2014经过修改并入 Linux 内核主线,从此 BPF 变成了一个更通用的执行引擎,主要用于网络、可…

DPDK BPF

DPDK BPF DPDK 自版本 18.05 已集成了 librte_bpf, 主要利用rte_eth_rx_burst/rte_eth_tx_burst 回调函数机制, 执行eBPF字节码. 当前支持以下特性: base eBPF ISA (except tail-pointer)JIT (x86_64 and arm64 only)eBPF code verifieruser-defined helper functions (64-bi…

Linux超能力BPF技术介绍及学习分享

近两年BPF技术跃然成为了一项热门技术,在刚刚结束的KubeCon 2020 Europe会议上有7个关于BPF的技术分享, 而在KubeCon 2020 China会议上也已有了3个关于BPF技术的中文分享,分别来自腾讯和PingCAP,涉足网络优化和系统追踪等领域。在…

bpf原理与入门

一、bpf架构 如上图所示,bpf由六部分构成,以下为其在bpf中的作用: bpf工具:该部分涉及bpf用户态程序、bpf的编译工具,通过bpf编译工具如Clang、LLVM将bpf用户态程序编译成bpf字节码; 加载器:可以简单理解为bpf系统调用,将bpf字节码加载到内核; 验证器:对bpf程序的…

BPF入门1:BPF技术简介

目录 cbpf 介绍ebpf 介绍ebpf 和 cbpf对比ebpf和内核模块的对比 ebpf应用ebpf架构Why BPF is FAST指令虚拟机JIT How BPF extends KernelLLVM 编写ebpf程序BCCBPFTraceC 语言原生方式 国内大厂使用ebpf的实践经验参考 cbpf 介绍 BPF(Berkeley Packet Filter &#…

增广拉格朗日函数

对于优化问题 arg ⁡ min ⁡ z E ( z ) ( 1 a ) s . t . C z − b 0 ( 1 b ) \mathop{\arg\min}_{z} \ E(z)\qquad(1a)\\ s.t. \quad Cz-b0 \qquad(1b) argminz​ E(z)(1a)s.t.Cz−b0(1b) 其增广拉格朗日函数被定义为: L ( z , α , μ ) E ( z ) α T ( C z −…

约束优化:PHR-ALM 增广拉格朗日函数法

文章目录 约束优化:PHR-ALM 增广拉格朗日函数法等式约束非凸优化问题的PHR-ALM不等式约束非凸优化问题的PHR-ALM对于一般非凸优化问题的PHR-ALM参考文献 约束优化:PHR-ALM 增广拉格朗日函数法 基础预备: 约束优化:约束优化的三种…

matlab编写拉格朗日插值代码函数

要求:根据拉格朗日多项式插值法原理,设计算法流程并且编写拉格朗日插值代码函数。 代码如下: function[y]lagrange(x0,y0,x) %建立一个函数名为lagrange的函数,输入x0,y0为插值点的坐标,均为数组,x为要…

拉格朗日函数最优化问题

目的:将有约束条件的函数最优化问题通过拉格朗日函数转化为无条件的函数最优化问题。 条件极值最优化问题: 对于无条件的函数最优化问题,常用的有3种方式: 梯度下降:求解一阶导数,其实就是使用泰勒一阶展…

【深度学习】拉格朗日( Lagrange)中值定理

文章目录 1、定理2、几何意义3、证明思路4、有限增量定理5、推论1、定理 如果函数 f(x) 满足: 在闭区间[a,b]上连续; 在开区间(a,b)内可导。 那么在(a,b)内至少有一点ξ(a<ξ<b),使等式 : f(b)-f(a)=f′(ξ)(b-a) 成立,或: f′(ξ) =(f(b)-f(a)) / (b-a) 或存…

拉格朗日(lagrange)插值及其MATLAB程序

一、n次拉格朗日插值 根据《插值多项式的性质》中的定理6.1可得 其中&#xff08;6.19&#xff09;称为基函数&#xff0c;&#xff08;6.18&#xff09;称为拉格朗日多项式&#xff0c;用&#xff08;6.18&#xff09;计算插值称为拉格朗日多项式插值。 方法2&#xff1a;通过…

拉格朗日函数优化

等式约束最优化 可以写为&#xff1a; 引入拉格朗日乘子&#xff08;&#xff09;把问题转换成拉格朗日函数 因为对于任何可行解&#xff0c;有&#xff0c;所以有 &#xff0c;也就是&#xff0c;。 求解。对分别求的偏导数为零&#xff0c;得到方程组求解极值点&#xff0c…

增广拉格朗日函数法

增广拉格朗日函数法 在二次罚函数法中&#xff0c;为了保证可行性&#xff0c;罚因子必须趋于正无穷。此时&#xff0c;子问题因条件数爆炸而难以求解。那么&#xff0c;是否可以通过对二次罚函数进行某种修正&#xff0c;使得对有限的罚因子&#xff0c;得到的毕竟最优解也是…

增广拉格朗日函数法(ALM)

增广拉格朗日函数法&#xff08; Augmented Lagrangian method&#xff09; 一、等式约束 考虑问题&#xff1a; min ⁡ x f ( x ) s . t . c i ( x ) 0 , i 1 , ⋯ , m . \begin{array}{ll} \min_x &f(x)\\ s.t. &c_i(x) 0, \quad i1,\cdots,m. \end{array} min…

广义拉格朗日函数的理解

1、拉格朗日函数&#xff1a; 求极值 求函数f(x,y,z)在条件φ(x,y,z)0下的极值 方法&#xff08;步骤&#xff09;是&#xff1a; 1.做拉格朗日函数Lf(x,y,z)λφ(x,y,z),λ称拉格朗日乘数 2.求L分别对x,y,z,λ求偏导,得方程组,求出驻点P(x,y,z) 如果这个实际问题的最大或…

各种拉格朗日函数

目录 一&#xff0c;拉格朗日函数 二&#xff0c;部分拉格朗日函数 三&#xff0c;增广拉格朗日函数 一&#xff0c;拉格朗日函数 以三元函数为例&#xff1a; 求f(x,y,z)的极值&#xff0c;s.t.g(x,y,z)0 拉格朗日函数L(x,y,z,a) f(x,y,z) a * g(x,y,z) 在极值点处一…

拉格朗日函数相关推导

优化问题&#xff08;即高数中的求极值&#xff09;可分为三类&#xff1a;无约束、等式约束、不等式约束。 对于无约束的优化问题&#xff1a;求导&#xff0c;令导数为零即可求解。 等式约束优化&#xff1a;&#xff08;拉格朗日乘子法最开始就是求解等式约束优化的方法&…

HJ-浇花

链接&#xff1a;https://ac.nowcoder.com/acm/contest/322/M 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 HJ养了很多花&#xff08;9999999…

单片机——自动浇花系统

目录 1、图片 2、代码 1、图片 2、代码 #include <reg51.h> //调用单片机头文件 #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535#include <intrins.h>sbi…

基于ESP32的开源定时浇花系统

基于ESP32的开源定时浇花系统 文章目录 基于ESP32的开源定时浇花系统前言一、软硬件环境二、模块连接图1.浇花功能说明2.Web界面展示 总结 前言 养了些许花花草草&#xff0c;需要按时浇灌&#xff0c;奈何总是要出差&#xff08;总想出去玩&#xff09;&#xff0c;又怕没人浇…