
在 Linux 内核开发和高级 eBPF 编程的世界里一场静悄悄的革命正在发生。长期以来编写 eBPF 程序的开发者们都在与“验证器Verifier”进行着艰苦卓绝的斗争。为了确保内核的绝对安全验证器会对每一行代码的指针访问进行死磕般的边界检查这导致开发者很难在 BPF 中构建链表、红黑树等复杂的自定义数据结构。然而随着BPF ArenaBPF 竞技场的推出这种局面被彻底打破。在最近举行的2026 年 Linux 存储、文件系统、内存管理与 BPF 峰会LSF/MM/BPF Summit上来自sched_ext项目的内核开发者 Emil Tsalapatis 更是带来了libarena的最新进展向我们展示了一个“让编写 BPF 像编写普通 C 语言一样简单”的未来。本文将为你全面拆解 BPF Arena 的核心概念、演进历史并深度解读本次峰会上关于libarena的前沿技术动态。第一部分什么是 BPF Arena要理解峰会上的新进展首先必须搞懂 BPF Arena 这个颠覆性的概念。1. 诞生背景与痛点在传统 eBPF 中如果程序想要存储和操作数据必须依赖内核预定义好的数据结构——BPF Maps如 Hash Map、Array Map 等。如果你尝试用普通 C 语言的方式写一个指针跳转如p p-next验证器会立刻拒绝加载因为它无法在编译时确定这个指针是否会指向非法内存。这种严苛的管制虽然保护了内核却极大地限制了复杂项目的开发。例如sched_ext允许用 eBPF 编写自定义 Linux 调度器的前沿项目它需要构建极其复杂的调度队列和优先级树。如果继续用传统的 BPF Map 硬抗代码会变得臃肿不堪性能也会大打折扣。2. 核心定义一块内存净土BPF Arena 是一块允许程序完全自由构建自身数据结构、不受验证器边界检查限制的虚拟内存区域。它具有以下三大核心特性自由构建在 Arena 内部验证器放开了边界检查。你可以像写普通 C 程序一样直接使用指针自由实现链表、树、图等任意结构。用户态共享这块内存可以通过mmap()直接映射到用户空间。内核中的 BPF 程序和用户空间的控制程序可以使用同一套指针直接读写内存消除了所有的数据拷贝开销。硬件级隔离验证器不检查了万一代码写错搞崩内核怎么办别担心BPF Arena 使用了独立的、巨大的特殊虚拟地址空间通常是地址空间 1。如果程序发生越界访问会直接触发硬件的缺页中断Page Fault内核会安全地终止该 BPF 程序而绝不会导致整个操作系统蓝屏或崩溃。3. 演进历史2024年Linux 6.9eBPF 创始人 Alexei Starovoitov 亲自操刀将 BPF Arena 的基础架构正式合并进 Linux 内核打破了验证器的传统枷锁。2025 - 2026年内核 7.x 时代基础设施基本完善生态建设成为核心。开发者们开始意识到既然大家都能在 Arena 里自由写数据结构就需要一套像 C STL 一样的“标准库”避免每个人都去重复造轮子。这便催生了libarena。第二部分2026 峰会直击libarena的愿景与挑战在 2026 年的 LSF/MM/BPF 峰会上Emil Tsalapatis 详细介绍了他在libarena上的工作。这是一个包含供 BPF Arena 使用的通用工具和数据结构的库。尽管该库目前已作为内核的一部分提供但它仍处于早期阶段。1. 打造 BPF 界的“标准库”Tsalapatis 的终极目标是让编写 BPF C 代码像编写普通 C 一样轻松。他将libarena构想为 BPF 程序的标准库纯 C 代码链接它不是引入新的内核接口而是可以直接编译并链接到 BPF 程序中的纯 C 源码。自包含与可选性它是完全可选的小型 BPF 程序如果不使用其功能完全不需要链接它。内核树内维护它的源码直接存放在内核树中并针对验证器进行严格测试确保其提供的算法能够顺利通过验证。同时由于它与内核版本绑定可以无缝使用最新的验证器特性。为了方便使用Tsalapatis 计划定期将源码导出到一个独立的 Git 仓库中用户可以像使用libbpf那样将其作为自包含的 Git 子模块Submodule添加到自己的项目中。2. 无法回避的代价与局限天底下没有免费的午餐使用 Arena 同样存在限制。Tsalapatis 坦言由于 BPF 程序可以随时、无检查地写入 Arena验证器无法信任存储在 Arena 中的内核对象指针例如struct task_struct *是否依然有效。因此验证器完全禁止在 Arena 中存储指向内核对象的指针。这些敏感的内核原生指针依然必须存储在传统的 BPF Map 中。但即便如此他认为把精力放在 Arena 上依然是非常值得的。第三部分深挖技术细节与未来路线图1. 兼容性大辩论CO-RE 的失效在峰会现场台下观众敏锐地提出了关于跨内核版本迁移的问题。传统的 eBPF 程序通过“一次编译到处运行”CO-RE重定位技术来适配不同的内核版本。然而CO-RE 无法作用于直接链接到 BPF 程序中的代码如libarena。Tsalapatis 表示libarena不会支持其引入之前的旧内核但通过精心设计可以实现向后兼容即前向兼容性。开发者可以针对他们想要支持的最老内核版本中的libarena进行构建从而免去对 CO-RE 的依赖。不过有观众对此表示怀疑因为在实际开发中程序在 Linux 6.9 上能通过验证、到了 6.19 却失败的例子屡见不鲜。对这一隐患eBPF 掌门人 Alexei Starovoitov 幽默地建议“等到了 7.5 内核我们再来操心这个问题吧现在 libarena 还早着呢”2. 7.2 内核的现状与调试工具ASAN在目前的 Linux 7.2 内核中libarena已开放供实验性使用。它目前包含一个基本的伙伴分配器Buddy Allocator和未来工作的脚手架虽然能处理各种大小的分配但速度还不算快。更重要的是它集成了对 Clang 地址消毒剂ASAN的调试钩子工作原理Arena 页面采用延迟映射Lazy Mapping。当分配内存时程序会以 8 字节的粒度在元数据区域将该内存标记为“安全”释放时清除标记。编译器会增强指针解引用操作在读写前先检查元数据状态。工具链限制这需要使用处于开发阶段的 Clang。因为传统的 Clang 假设元数据内存总是在 0 号地址空间而 BPF Arena 使用的是 1 号地址空间为此 Tsalapatis 专门为 Clang 贡献了一个新标志注Clang 对地址空间使用数字编号而 GCC 使用名称。3. 未来路线图引入 mimalloc 与 AI 友好在内存分配器方面Tsalapatis 透露未来可能会弃用伙伴分配器转而采用mimalloc的架构设计。mimalloc最初为函数式语言运行时设计在多线程和短生命周期分配方面性能极佳这非常契合未来高性能 BPF 程序的诉求。此外libarena计划在未来至少提供以下核心数据结构红黑树Red-Black TreesB树B-Trees位图BitmapsLev-Chase 队列Chase-Lev 队列有趣的是Tsalapatis 还谈到了大语言模型LLM对内核开发的影响。他认为即使未来人们开始用 AI 编写 BPF 程序手写的高质量libarena数据结构依然无可替代“根据我的经验我发现为 AI 智能体Agent提供优质的代码种子能让他们一举解决困难的技术问题。”总结从 Linux 6.9 的初出茅庐到 2026 年 7.x 内核生态里libarena的百花齐放BPF Arena 正在将 eBPF 从一个“只能做简单数据过滤的沙盒”解放为一个“可以跑任意复杂算法的高性能执行环境”。尽管目前它在内核指针存储和跨版本验证上面临一些限制与挑战但它为开发者带来的“编程自由度”和“极致性能”是无与伦比的。随着libarena走向成熟未来的 Linux 内核扩展开发将会变得前所未有的简单与高效。