BPF过滤器实现
hurd/libbpf/bpf_impl.c
BPF过滤器
BPF最初是 Berkeley Packet Filter 就是用来过滤网络包的过滤器.
在UNIX中cBPF(classic BPF)的执行位于内核态.
而在Hurd中cBPF是hurd的用户态实现.
cBPF模型
一条指令的结构如下:
总共64bits
code: 16bits, 代表指令 比如
LDSTADDJEQjt: 8bits, 告诉
jump要跳多少指令 当jump条件成立时jf: 8bits, 告诉
jump要跳多少指令 当jump条件失败时k: 32bits, 具体含义与
code相关
比如指令: LD[12] :
code = BPF_LD | BPF_W | BPF_ABS
jt = 0
jf = 0
k = 12
解释器的核心状态如下:
A: accumulator 累加器 计算寄存器
X: index register 间接寻址
M[0..15]: scratch memory 临时变量区
PC: program counter
unsigned int A, X;
int k;
unsigned int mem[BPF_MEMWORDS];