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_FETCH
的 BPF_ADD
。如果需要启用原子特性,同时保持较低的 -mcpu
版本,可以使用 -Xclang -target-feature -Xclang +alu32
。