58 struct bpf_insn { 59 __u8 code; /* opcode */ 60 __u8 dst_reg:4; /* dest register */ 61 __u8 src_reg:4; /* source register */ 62 __s16 off; /* signed offset */ 63 __s32 imm; /* signed immediate constant */ 64 };
一条bpf的指令包括:8字节长
其中操作码共8位,0,1,2这三位表示的是该操作的大类别:0X07
BPF_LD(0x00) / BPF_LDX(0x01) / BPF_ST(0x02) / BPF_STX(0x03) / BPF_ALU(0x04) / BPF_JMP(0x05) / BPF_RET(0x06) / BPT_MISC(0x07)
对于 LD大类 来说:
3,4位表示的是位宽0x00 代表4字节,0x08:2字节,0x10:1个字节 0X18
5.6.7三位表示的是:0XE0
BPF_IMM / BPF_ABS / BPF_IND / BPF_MEM / BPF_LEN / BPF_MSH
对于ALU和JMP大类来说:
4,5,6,7 高四位表示的是具体的操作:0xf0
BPF_ADD / BPF_SUB / BPF_MUL / BPF_DIV / BPF_OR / BPF_AND / BPF_LSH / BPF_RSH / BPF_NEG / BPF_MOD / BPF_XOR / BPF_JA / BPF_JEQ / BPF_JGT / BPF_JGE / BPF_JSET /
第3位表示的是:0x08
BPF_K/BPF_X
BPF使用的寄存器包括:
* R0 - return value from in-kernel function, and exit value for eBPF program * R1 - R5 - arguments from eBPF program to in-kernel function * R6 - R9 - callee saved registers that in-kernel function will preserve * R10 - read-only frame pointer to access stack
code 操作码(8 bit)
目标寄存器(4 bit),源寄存(4 bit),偏移(16bit),立即数(32bit)