eBPF运行原理
eBPF虚拟机
eBPF的虚拟机和系统虚拟化(KVM)有着本质的不同
- 系统虚拟化:基于x86或者arm64等通用指令集,这些指定集足以完成完整计算机的所有功能
- eBPF虚拟机:为了确保在内核中安全的执行,eBPF只提供了有限的指令集。这些指令集只可以完成部分的内核功能,远远不足以模拟完整计算机。同时为了高效方便的与内核交互,指令采用C调用约定。提供的辅助函数可以直接在C语言中直接调用。
eBPF运行时
eBPF在内核中的运行时主要由五个模块组成:
-
eBPF辅助函数
-
eBPF验证器:用于确保eBPF程序的安全。
-
11个64位寄存器,一个程序计数器和一个512字节的栈组成的存储模块。
这个模块用于控制eBPF程序的执行。
- 其中R0寄存器用来存储函数调用和eBPF程序的返回值,这意味着函数调用只能有一个返回值。
- R1-R5寄存器用于函数调用的参数,因此函数的调用参数不能超过5个。
- R10寄存器,是一个只读寄存器,用于从栈中读取数据
-
即时编译器:将eBPF字节码编译成本地机器指令
-
eBPF映射(map):提供了大块的存储,这些存储空间可以被用户空间程序用来进行访问,进而控制eBPF的程序的运行状态。