1 Clang 实现注意事项¶
本文档提供了 Clang/LLVM 实现 eBPF 指令集的更多详细信息。
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
。