购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1 BPF的历史

1992年,Steven McCanne和Van Jacobson写了一篇名为“The BSD Packet Filter:A New Architecture for User-Level Packet Capture”的论文。在文中,作者描述了他们如何在Unix内核实现网络数据包过滤,这种新的技术比当时最先进的数据包过滤技术快20倍。数据包过滤有一个特定的目的:可以编写应用程序直接使用内核信息来监控系统网络。有了这些内核信息,应用程序就可以决定如何处理这些数据包。BPF在数据包过滤上引入了两大革新:

·一个新的虚拟机(VM)设计,可以有效地工作在基于寄存器结构的CPU之上。

·应用程序使用缓存只复制与过滤数据包相关的数据,不会复制数据包的所有信息。这样可以最大限度地减少BPF处理的数据。

由于这些巨大的改进,所有的Unix系统都选择采用BPF作为网络数据包过滤技术,而放弃了原有消耗大内存和低性能的实现。直到今天,许多Unix内核的派生系统中(包括Linux内核)仍使用该实现。

2014年初,Alexei Starovoitov实现了eBPF。新的设计针对现代硬件进行了优化,所以eBPF生成的指令集比旧的BPF解释器生成的机器码执行得更快。扩展版本也增加了虚拟机中的寄存器数量,将原有的2个32位寄存器增加到10个64位寄存器。由于寄存器数量和宽度的增加,开发人员可以使用函数参数自由交换更多的信息,编写更复杂的程序。总之,这些改进使eBPF版本的速度比原来的BPF提高了4倍。

eBPF实现的最初目标是优化处理网络过滤器的内部BPF指令集。当时,BPF仍然限于内核空间使用,只有少数用户空间程序可以编写内核处理的BPF过滤器,例如Tcpdump和Seccomp,在后面的章节中我们会讨论这些程序。时至今日,这些程序仍基于旧的BPF解释器生成字节码,但内核中会将这些指令转换为高性能的内部表示。

2014年6月,eBPF 扩展到用户空间。这是BPF的转折点。正如Alexei在提交补丁的注释中写道:“这个补丁展示了eBPF的潜力。”

BPF不再局限于网络栈,已经成为内核顶级的子系统。BPF程序架构强调安全性和稳定性,看上去更像内核模块,但与内核模块不同,BPF程序不需要重新编译内核,并且可以确保BPF程序运行完成,而不会造成系统的崩溃。

在第2章中,我们将讨论BPF验证器,BPF验证器添加了必需的安全保障。它能确保任何BPF程序运行完成,不会造成系统的崩溃,并且它确保程序不会出现内存溢出。这得益于对BPF程序的限制,例如,程序大小的最大限制和循环的限制,以确保不会因为BPF程序错误,而产生系统内存溢出。

为了使BPF可以从用户空间访问,内核开发人员还添加了一个新的系统调用:bpf。bpf系统调用用于用户空间和内核之间的通信。我们将在本书第2章和第3章中讨论如何使用bpf系统调用与BPF程序、BPF映射一起工作。

BPF映射是内核与用户空间交换数据的主要机制。第2章将演示如何使用映射来收集来自内核的信息,以及发送信息到内核中运行的BPF程序。我们还将详细介绍在eBPF影响下,BPF程序、BPF映射和内核子系统的演变。 QC8rItYRXDGBGx87KvlxxoTSm9Urx33a5u5uV9SEo0JYpnZO6Q1zDTBc5Gwk5yg2

点击中间区域
呼出菜单
上一章
目录
下一章
×