1 Clang 实现说明

本文档提供了有关 eBPF 指令集的 Clang/LLVM 实现的更多详细信息。

1.1 版本

Clang 定义了“CPU”版本,其中 CPU 版本 3 对应于当前的 eBPF ISA。

Clang 可以使用 -mcpu=v3 选择 eBPF ISA 版本,例如选择版本 3。

1.2 算术指令

对于早于版本 3 的 CPU 版本,Clang v7.0 及更高版本可以使用 -Xclang -target-feature -Xclang +alu32 启用 BPF_ALU 支持。在 CPU 版本 3 中,自动包含此支持。

1.3 跳转指令

如果使用 -O0,Clang 将生成 BPF_CALL | BPF_X | BPF_JMP (0x8d) 指令,而 Linux 内核验证器不支持此指令。

1.4 原子操作

默认情况下,启用 -mcpu=v3 时,Clang 可以生成原子指令。如果为 -mcpu 设置了较低的版本,Clang 可以生成的唯一原子指令是不带 BPF_FETCHBPF_ADD。如果需要启用原子特性,同时保持较低的 -mcpu 版本,可以使用 -Xclang -target-feature -Xclang +alu32