Hero Image
RISC-V eBPF 系列 1:eBPF 简介

前言 本文会对 eBPF 技术进行初步的介绍,包括基本原理,相关基础设施以及主要的应用场景,帮助读者对 eBPF 技术有一个总体的认识,了解涉及的众多概念,方便后续需要深入了解时知道要查找什么内容。 背景 BPF BPF (Berkeley Packet Filter) 是类 Unix 系统上数据链路层的一种原始接口,提供原始链路层封包的收发。Linux 内核采用 BPF 作为网络数据包过滤技术。 包括像 tcpdump 的底层也是采用 BPF 作为底层包过滤技术。 eBPF eBPF 是一项革命性技术,它能在内核中运行沙箱程序(sandbox programs),而无需修改内核源码或者加载内核模块。 eBPF (extended Berkeley Packet Filter) 是在 BPF 基础上经过重新设计,逐步演进为一个通用执行引擎,允许用户在操作系统的内核中加载和运行自定义程序,可用于扩展甚至修改内核行为。 eBPF 最早出现在 3.18 内核版本中,此后原来的 BPF 就被称为经典 BPF,缩写为 cBPF(classic BPF)。 Why eBPF Linux 内核的主要作用是管理硬件或虚拟硬件,并提供一致的 API(系统调用),以实现应用程序运行和共享资源。Linux 划分了一组子系统来分别管理。每个子系统一般在一定程度上都提供了可配置的功能,来满足用户的不同需求。如果满足不了需求,则需要对内核进行更改,可以通过直接修改子系统或者编写一个内核模块两种方式,但都存在痛点: 直接给对应子系统提交 Patch: 需要说服 Linux 内核社区相信更改是有必要的 新的内核版本一般需要几年时间才能够商用 编写一个内核模块: 需要定期修复内核模块,因为每个内核版本都可能损坏该模块 缺乏安全边界,可能会损坏 Linux 内核 而使用 eBPF,可以使用一种新方法来重新对内核行为进行编程,而无需更改内核源码或者加载内核模块。 基本概念和原理 Hook(钩子) eBPF 程序是事件驱动的,当内核或应用程序执行到某个钩子时运行。预定义的钩子包括系统调用,函数进入/退出,内核跟踪点,网络事件等。如果预定义的钩子不满足需求,可以创建 kprobe 或 uprobe 来作为自定义钩子触发 ePBF 程序。