Overview Link to heading

这里有一个关于星际飞船、太空旅行的故事,还有一个关于小蜜蜂的故事。这些小蜜蜂帮助运营着最大的飞船,也让整个社区受益。

即便是那些最微小、最年幼的个体,也都有其独特的使命。正因如此,全民教育,尤其是针对儿童的教育,显得至关重要!无论你是青春年少还是年长资深,这篇文章都将为你揭示 eBPF 的奥秘。请稳住,我们这就开始!

启航 Link to heading

远远地,在天空、小行星和尘埃之外,“银色曙光号”穿梭于星云之间。甲板上,在指挥台前,是船长塔克斯,他载着乘客穿越银河。

正当船员们辛勤劳作,协助船长之际,所有旅客都享受着舒适、宁静与闲适。但那间狭小的引擎室却严禁入内,那里是金属与火焰交织的关键系统所在。

eBPF 源自 Linux,这是一种在全球数十亿设备上运行的操作系统,它被划分为用户空间(大多数应用程序在此运行)和内核空间(为应用程序提供与底层硬件交互的接口)。内核对整个系统具有全局可见性且性能优异,但需要为应用程序提供稳定的接口,因此它在灵活性上不及用户空间编程。

困境 Link to heading

穿越银河,往返多年,船员们学会了改装飞船,调整配置。他们更换了推进器,加固了护盾,升级了超空间引擎,只为探索最奇特的星球,以及更遥远的世界。

但无论是在太空真空中,还是在水世界般的月球上,升级系统都困难重重,令人沮丧。塔克斯船长急需一种快速替换物品的方法,以便迅速适应需求,让航程延续。

由于 Linux 是一个庞大且重要的项目,更新内核可能需要数年才能到达在生产环境中运行稳定长期支持版本(LTS)的最终用户。

可以通过编写和加载内核模块来扩展内核的功能,但这会带来自身的风险,模块可能会崩溃或以其他方式损害内核。如果模块没有提交到上游,它们还需要不断调整以适应内核的演进。

希望 Link to heading

有一天,忧心忡忡的塔克斯船长检视船员时,突然想起蜜蜂早就随船同行了。它们默默无闻地忙碌着,尽管任务不多。塔克斯船长灵光一闪:这下它们可再也不会感到无聊了!

  • “你足够小了,可以直接飞到引擎室,从内部着手处理。”他对小蜜蜂 eBee 说道
  • “你愿意帮忙吗?”
  • “当然!”eBee 回答道,“我们很乐意提供协助,寻求创新,并且坚定地站在你这边!”

eBPF 源自最初的伯克利数据包过滤器(Berkeley Packet Filter,BPF,用于 tcpdump),但现在早已超越了网络范畴,让用户能够以编程方式扩展操作系统的几乎所有功能。

eBPF 是一种事件驱动架构,当内核或应用程序触发特定钩点时,会执行相应的程序。例如,内核探针(kprobe)或用户探针(uprobe)可用于在内核或用户程序中的几乎任何位置附加 eBPF 跟踪程序。eBPF 是一种强类型汇编语言,拥有稳定的指令集。

eBPF 程序无需重启内核即可实时加载和升级。

行动 Link to heading

蜂巢里汇聚了各种才能的蜜蜂,承担着五花八门的职责。有科学家、教师、总机接线员、电工、探险家,甚至还有侦探。它们穿戴整齐,穿过气闸,来到了引擎处。

引擎冒烟了,几只蜜蜂有些害怕,担心会损坏引擎,或者仅仅是卡住一个齿轮。

“别担心,”塔克斯船长说,“我来帮你们。”

他训练了它们,确保它们能穿透烟雾。

Linux 内核期望 eBPF 程序以字节码的形式加载。通常,eBPF 开发者会使用 C、Rust 或其他语言编写程序,然后将其编译成 eBPF 字节码。eBPF 程序可以通过 bpf() 系统调用直接加载到 Linux 内核,或者借助可用的 eBPF 库进行加载。

验证器在特权环境下运行,执行静态分析以确保 eBPF 程序对内核(有时也包括硬件)来说是安全的。它会检查加载 eBPF 程序的进程是否具备必要的权限,程序不会导致系统崩溃或泄露敏感内存,并且程序总能正常完成执行(不会无限循环,从而阻塞后续处理)。