为什么拥有用户空间版本的 eBPF 很有趣?

Why is having an userspace version of eBPF interesting?

我看到正在开发 ebpf 的用户空间版本(运行时、汇编程序、反汇编程序)(uBPF, rbpf)。

为什么拥有 eBPF 的用户空间版本很有趣?
这些替代方案是否与 eBPF 程序类型(网络、可观察性和安全性)关注相同的目标?

eBPF 的主要优点之一是它 运行 是内核中的代码。可观察性、内核数据聚合、早期数据包处理:这一切都发生在内核 space 中。所以这个问题听起来很合理:为什么要创建 uBPF 或 rbpf?

我认为它们主要是作为原型创建的。 uBPF 在 eBPF 历史上很早就被引入,并且可能是 eBPF 解释器和 x86_64 JIT 在用户 space 中的概念验证实现。我写了 rbpf,它强烈地基于 uBPF,对我来说主要 objective 是为了更熟悉两件事:eBPF 和 Rust。很少有事后的想法:)。

我一直很好奇人们可以用它做什么。说实话,没有那么多用户。 rbpf 的最大用户可能是来自 Solana 的人,他们实现了一些 blockchain tool with smart contracts run in the eBPF machine。我过去遇到的另一个用例是调试一些 eBPF 字节码,因为在用户 space 解释器中很容易设置断点(相比之下,运行 常规内核 eBPF 的时间调试是目前相当有限)。

uBPF 取得了更大的成功,并被用作 DPDK 等其他项目的基础 a filtering library or Oko, an extension to Open vSwitch (both about high-performance network processing). [Edit August 2021] More recently, it was chosen to serve as an eBPF runtime for the implementation of eBPF for Windows (references: announcement, my analysis)。

如您所见,拥有这些用户 space eBPF 机器的 兴趣 完全取决于您使用它做什么。它们可用于 运行 eBPF 程序,它们本身没有特定的重点,但如果您有用例,它们可以提供帮助。在这方面,uBPF 和 rbpf 的特殊性之一是它们的许可证(Apache、MIT):它们不在 GPL 之下,这意味着您可以在更多项目中重用它们,包括专有项目。来自内核的代码不是这种情况。

对于那些用户 space eBPF 机器来说,一个很大的限制是它们在内核中发生的事情方面往往已经过时了,那里的事情发展很快。他们没有可靠的验证程序,因此您无法断言程序的安全性。它们几乎不支持 eBPF 映射(如果有的话),它们不支持函数调用或 BTF,甚至不支持与此相关的最新 eBPF 指令。其中一些可以添加,但这需要一些工程工作和时间。 [编辑 2021 年 8 月] uBPF 得到了很多 activity 现在微软为其 eBPF 实施做出了贡献。他们还使用用户-space验证器,PREVAIL.