事件和钩子
eBPF 程序是在内核中被事件触发的。在一些特定的指令被执行时时,这些事件会在钩子处被捕获。钩子被触发就会执行 eBPF 程序,对数据进行捕获和操作。钩子定位的多样性正是 eBPF 的闪光点之一。例如下面几种:
系统调用: 当用户空间程序通过系统调用执行内核功能时。
功能的进入和退出: 在函数退出之前拦截调用。
网络事件: 当接收到数据包时。
kprobe 和 uprobe: 挂接到内核或用户函数中。
辅助函数
eBPF 程序被触发时,会调用辅助函数。这些特别的函数让 eBPF 能够有访问内存的丰富功能。例如 Helper 能够执行一系列的任务:
在数据表中对键值对进行搜索、更新以及删除。
生成伪随机数。搜集和标记隧道元数据。
把 eBPF 程序连接起来,这个功能被称为 tail call。
执行 Socket 相关任务,例如绑定、获取 Cookie、数据包重定向等。
简单来说,eBPF 的工作流程:
把 eBPF 程序编译成字节码。在载入到 Hook 之前,在虚拟机中对程序进行校验。
把程序附加到内核之中,被特定事件触发。
JIT 编译。
在程序被触发时,调用辅助函数处理数据。
在用户空间和内核空间之间使用键值对共享数据。
eBPF 程序通过安全检查后插入钩子,被事件触发之后,程序会启动执行,
用辅助函数和 Map 来对数据进行存储和操作。