bpf 指令集

 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)

原文地址:https://www.cnblogs.com/honpey/p/8013073.html