- 深入理解eBPF与可观测性
- 毛文安 郑昱笙 程书意 廖肇燕
- 910字
- 2025-06-09 17:11:28
1.3.1 eBPF加载流程和相关组件
eBPF加载流程主要包括以下几个步骤。
1)编写eBPF程序:首先,用户需要使用C语言或eBPF汇编代码编写eBPF程序。程序通常包括内核态部分和用户态部分。内核态部分包含eBPF程序的实际逻辑,用户态部分负责加载、运行和监控内核态程序,解析内核态输出的信息。
2)编译eBPF程序:编写完eBPF程序后,需要使用LLVM、Clang等工具将它编译成ELF(Executable and Lin-kable Format,可执行和链接格式)文件,然后通过libbpf[2]或其他工具对ELF文件进行解析,按照需要的格式整理数据。接着,通过BPF系统调用,将这些数据加载到内核中。
3)校验和翻译:在内核中,有一个校验器负责对eBPF程序进行校验,确保其安全性。校验通过后,使用JIT编译器对eBPF程序进行翻译解析,使程序在内核中高效执行。
4)运行和监控:eBPF程序在内核中运行时,会触发特定事件,并将事件相关信息传递给用户态程序。用户态程序负责处理这些信息并将结果输出。当程序运行完成后,用户态程序可以卸载并结束eBPF程序的运行。
图1-13展示了eBPF字节码的加载流程涉及的关键技术。

图1-13 eBPF字节码加载流程涉及的关键技术
eBPF字节码加载涉及的关键技术的具体说明如下。
1)CO-RE:CO-RE是eBPF程序能够兼容不同内核版本的关键所在,它结合内核提供的BTF文件实现此功能。eBPF字节码加载时会由CO-RE将一些结构体信息进行重定位,以适应不同内核版本的结构体差异。
2)BPF_PROG_LOAD:BPF_PROG_LOAD是将eBPF字节码加载到内核中的系统调用。该系统调用还会传递其他信息,如eBPF程序类型、安全选项和相关的资源。
3)verifier校验:在字节码加载过程中,内核会通过校验器对eBPF程序进行安全性和正确性检查。这个验证过程由verif ier组件负责。verif ier会检查eBPF程序的字节码,验证其访问权限、指令顺序、循环结构等,并确保程序在执行时不会导致内核崩溃或引入安全漏洞。
4)JIT编译:在通过验证后,eBPF程序进入JIT编译阶段。在这个阶段,JIT编译器将eBPF字节码转换为目标机器码,以便在运行时高效执行。JIT编译器会根据目标架构的特性和要求,对eBPF字节码进行优化和转换,生成适合目标架构的高效机器码。截至目前,eBPF的JIT编译器已经支持了多个架构:ARM32、ARM64、LoongArch、MIPS、PowerPC、RISC-V、s390、SPARC和x86-64。本节主要介绍x86-64平台的eBPF JIT实现。一旦目标机器码生成完毕,内核会为它们分配相应的内存空间。这些代码会根据特定的触发条件开始执行eBPF程序。