BPF简介
作者:互联网
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.
- BPF程序 ----LLVM+Clang----> BPF字节码 ----JIT----> BPF指令集;
- BPF架构采用一种新的虚拟机设计,包含支持x86_64, arm64, mips64等架构的指令集,BPF指令集程序可以高效地工作在基于寄存器架构(r0到r10)的CPU上;
- Linux内核维护者不断开发hook点,可以在hook点上挂载BPF程序,当hook点对应的事件发生就可以执行BPF程序,BPF程序返回hook点预定义的值,Linux内核再根据返回值执行下一步操作(比如XDP类型的BPF程序挂载在指定的网络接口上,有数据包进入该网络接口,BPF程序对数据包进行解析然后根据协议字段进行判断,如果不符合规则就返回XDP_DROP,Linux内核根据该返回值就会丢弃该数据包)。
BPF工作原理:
BPF关键组件:
-
BPF Hooks
-
BPF映射:
- BPF程序和用户空间程序通过BPF映射通信;
- BPF映射以键/值保存在内核,可以被任何BPF程序访问,用户空间的程序可以通过文件描述符访问BPF映射
- BPF映射类型:BPF映射支持多种数据结构,从而实现内核内部数据的组织以及用户态和内核态的通信,比如哈希表、数组、队列等等
4. BPF映射用途举例:
1)在BPF程序不中断的情况下修改其运行方式,修改映射中BPF程序访问的配置数据或应用数据,例如黑名单规定的IP列表和域名;
2)运行在内核的BPF程序统计进入指定网络接口的数据包信息,并将统计信息保存到BPF映射,用户态程序可以通过BPF映射获取数据包统计信息;
- BPF辅助函数(BPF Helper Function):如其他语言生态会提供丰富的库提供大量的API函数,BPF也包含各种常用的辅助函数,提供操作内核数据和BPF映射的工具类函数;
- 优点:通过定义和维护BPF辅助函数,由BPF辅助函数维护者处理Linux内核版本的迭代更新,对开发者透明,形成稳定的API接口;
- BPF辅助函数列表:
标签:映射,BPF,简介,程序,内核,Linux,数据包 来源: https://www.cnblogs.com/linhaostudy/p/16215089.html