ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BPF简介

2022-05-02 09:32:29  阅读:269  来源: 互联网

标签:映射 BPF 简介 程序 内核 Linux 数据包


BPF,及伯克利包过滤器Berkeley Packet Filter,最初构想提出于 1992 年,其目的是为了提供一种过滤包的方法,并且要避免从内核空间到用户空间的无用的数据包复制行为。它最初是由从用户空间注入到内核的一个简单的字节码构成,它在那个位置利用一个校验器进行检查 —— 以避免内核崩溃或者安全问题 —— 并附着到一个套接字上,接着在每个接收到的包上运行。几年后它被移植到 Linux 上,并且应用于一小部分应用程序上(例如,tcpdump)。其简化的语言以及存在于内核中的即时编译器(JIT),使 BPF 成为一个性能卓越的工具。

然后,在 2013 年,Alexei Starovoitov 对 BPF 进行彻底地改造,并增加了新的功能,改善了它的性能。这个新版本被命名为 eBPF (意思是 “extended BPF”),与此同时,将以前的 BPF 变成 cBPF(意思是 “classic” BPF)。新版本出现了如映射和尾调用tail call这样的新特性,并且 JIT 编译器也被重写了。新的语言比 cBPF 更接近于原生机器语言。并且,在内核中创建了新的附着点。

感谢那些新的钩子,eBPF 程序才可以被设计用于各种各样的情形下,其分为两个应用领域。其中一个应用领域是内核跟踪和事件监控。BPF 程序可以被附着到探针(kprobe),而且它与其它跟踪模式相比,有很多的优点(有时也有一些缺点)。

另外一个应用领域是网络编程。除了套接字过滤器外,eBPF 程序还可以附加到 tc(Linux 流量控制工具)的入站或者出站接口上,以一种很高效的方式去执行各种包处理任务。这种使用方式在这个领域开创了一个新的天地。

并且 eBPF 通过使用为 IO Visor 项目开发的技术,使它的性能进一步得到提升:也为 XDP(“eXpress Data Path”)添加了新的钩子,XDP 是不久前添加到内核中的一种新式快速路径。XDP 与 Linux 栈组合,然后使用 BPF ,使包处理的速度更快。

甚至一些项目,如 P4、Open vSwitch,考虑 或者开始去接洽使用 BPF。其它的一些,如 CETH、Cilium,则是完全基于它的。BPF 是如此流行,因此,我们可以预计,不久之后,将围绕它有更多工具和项目出现 …

什么是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

BPF工作原理:

image

BPF关键组件:

  • BPF Hooks
    image

  • BPF映射:

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

image

4. BPF映射用途举例:

1)在BPF程序不中断的情况下修改其运行方式,修改映射中BPF程序访问的配置数据或应用数据,例如黑名单规定的IP列表和域名;

2)运行在内核的BPF程序统计进入指定网络接口的数据包信息,并将统计信息保存到BPF映射,用户态程序可以通过BPF映射获取数据包统计信息;

image

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

image

标签:映射,BPF,简介,程序,内核,Linux,数据包
来源: https://www.cnblogs.com/linhaostudy/p/16215089.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有