上海品茶

6.ARM64 eBPF JIT现状介绍.pptx

编号:161112 PPTX 22页 626.12KB 下载积分:VIP专享
下载报告请您先登录!

6.ARM64 eBPF JIT现状介绍.pptx

1、首届中国首届中国eBPFeBPF研讨会研讨会ARM64 eBPF JIT社区现现状主讲讲人:侯涛2022-11-12首届中国首届中国eBPFeBPF研讨会研讨会议题议题 What:ARM64 eBPF JIT是什么?How:ARM64 eBPF JIT做了什么?Where:ARM64 eBPF JIT还缺什么?首届中国首届中国eBPFeBPF研讨会研讨会What:简单简单的解释释 实现了eBP翻译器 将eBPF指令翻译为ARM64指令,提升运行性能 如果没有实现,会通过eBPF解释器运行SEC(“tp/syscalls/sys_enter_nanosleep”)bpf_printk(“hell

2、o worldn”);return 0;eBPF指令clang-target bpf.ARM64指令libbpf 重定向bpf(BPF_PROG_LOAD,)verifier重写首届中国首届中国eBPFeBPF研讨会研讨会What:翻译译的结结果 bpftool 查看eBPF指令和ARM64指令#bpftool prog dump xlated id 3489 opcodeint handle_tp(void*ctx):;bpf_printk(hello worldn);0:(18)r1=mapid:1850+0 18 21 00 00 b9 00 00 00 00 00 00 00 00 0

3、0 00 00 2:(b7)r2=13 b7 02 00 00 0d 00 00 00 3:(85)call bpf_trace_printk#-64496 85 00 00 00 10 04 ff ff;return 0;4:(b7)r0=0 b7 00 00 00 00 00 00 00 5:(95)exit 95 00 00 00 00 00 00 00#bpftool prog dump jited id 3489bpf_prog_08424f7d1079fa76_handle_tp:0/309;bpf_printk(hello worldn);.40:mov x1,#0 xd 44:

4、mov x10,#0 xffffffffffff0aa8 48:movk x10,#0 x830,lsl#16 4c:movk x10,#0 xfe00,lsl#32 50:blr x10 .#bpftool map show id 185185:array name hello_bp.rodata flags 0 x480 key 4B value 13B max_entries 1 memlock 4096B btf_id 283 frozen pids hello(742185)#bpftool map dump id 185.value:0 x68,0 x65,0 x6c,0 x6c,

5、0 x6f,0 x20,0 x77,0 x6f,0 x72,0 x6c,0 x64,0 x0a,0 x00.首届中国首届中国eBPFeBPF研讨会研讨会How:eBPF指令集(1)目标 JIT友好:常用架构指令的子集,基本直接对应硬件定义 生成 编译器(clang)将类C程序编译为eBPF指令 寄存器定义 64-bits寄存器 10个通用寄存器:R0R9 R0:返回值 R1R5:函数参数 bpf helper最多5个参数 R6R9:临时寄存器(被调用者保存和恢复)1个栈寄存器:R10,栈大小最大512字节首届中国首届中国eBPFeBPF研讨会研讨会How:eBPF指令集(2)eBPF指令 绝大

6、多数是8字节,少数是16字节 主机字节序(host endian)struct bpf_insn _u8 code;/*opcode*/_u8 dst_reg:4;/*dest register*/_u8 src_reg:4;/*source register*/_s16 off;/*signed offset*/_s32 imm;/*signed immediate constant*/;BPF_LD:加载64-bits立即数(比如map_fd、map_value等)classclassdescriptiondescriptionBPF_LDnon-standard loadBPF_LDXl

7、oad into registerBPF_STstore from immediateBPF_STXstore from registerBPF_ALU32-bits arithmeticBPF_JMP64-bits arithmetic and jumpBPF_JMP3232-bits arithmetic and jumpBPF_ALU6464-bits arithmetic首届中国首届中国eBPFeBPF研讨会研讨会How:eBPF指令集(3)ALU和ALU64 ALU在eBPF-mcpu=v3中引入,直接操作32-bits寄存器,减少32-bits和64-bits的相互转换(JMP32

8、条件跳转也是类似的)#clang-mcpu=v3-O-2-g-target bpf;sum=a+b;12:(0c)w3+=w0 0c 03 00 00 00 00 00 00;if(sum)13:(16)if w3=0 x0 goto pc+4 16 03 04 00 00 00 00 00#clang-mcpu=v2-O-2-g-target bpf;sum=a+b;12:(0f)r3+=r0 0f 03 00 00 00 00 00 00 13:(bf)r1=r3 bf 31 00 00 00 00 00 00 14:(67)r1=32 77 01 00 00 20 00 00 00;if

9、(sum)16:(15)if r1=0 x0 goto pc+4首届中国首届中国eBPFeBPF研讨会研讨会How:eBPF指令集(4)例子 BPF_LDX_MEM(BPF_DW,R1,R10,-8):r1=*(u64*)(r10-8)BPF_ALU32_IMM(BPF_ADD,R1,100):w1+=100 BPF_ST_MEM(BPF_W,R10,-12,0 x00667062):*(u32*)(r10-12)=0 x00667062 BPF_STX_MEM(BPF_DW,R10,R9,-32):*(u64*)(r10-32)=r9 BPF_JMP_REG(BPF_JNE,R0,R6,12

10、):if(r0!=r6)goto PC+12 BPF_RAW_INSN(BPF_JMP|BPF_CALL,0,0,0,6):调用bpf_trace_printk helper BPF_LD_IMM64_RAW(R1,BPF_PSEUDO_MAP_FD,4):r1=map fd 1(16字节指令)首届中国首届中国eBPFeBPF研讨会研讨会How:JIT的过过程(1)寄存器映射 eBPF寄存器-ARM64寄存器 计算出使用的指令数量 生成prologue:压栈、保存callee-saved寄存器、生成栈空间 生成body:逐条指令翻译、添加异常访问处理表 生成epilogue:退栈、恢复call

11、ee-saved寄存器、返回到调用者 分配内存 包括:指令数量+异常访问处理表 实际生成具体的指令+异常访问处理表 生成prologue/body/epilogue首届中国首届中国eBPFeBPF研讨会研讨会How:JIT的过过程(2)prologue 0:stp x29,x30,sp,#-16!4:mov x29,sp 8:stp x19,x20,sp,#-16!c:stp x21,x22,sp,#-16!10:stp x25,x26,sp,#-16!14:mov x25,sp 18:mov x26,#0 x0 1c:sub sp,sp,#0 x0 epilogue 44:mov w7,#0

12、 x0 48:mov sp,sp 4c:ldp x25,x26,sp,#16 50:ldp x21,x22,sp,#16 54:ldp x19,x20,sp,#16 58:ldp x29,x30,sp,#16 5c:add x0,x7,#0 x0 60:ret 寄存器映射R0-x7R1R5-x0 x4R6R9-x19x22R10-x25LR/调用者FPX20/X19X22/X21X26/X25bpf prog FPBPF frame pointerBPF stackbpf prog SP首届中国首届中国eBPFeBPF研讨会研讨会How:JIT的过过程(3)ARM64指令(body)20:mo

13、v x0,#0 xffff8000ffffffff 24:movk x0,#0 x14c4,lsl#16 28:movk x0,#0 xe000 2c:mov w1,#0 xd 30:mov x10,#0 xffffffffffff51d8 34:movk x10,#0 x103d,lsl#16 38:movk x10,#0 x8000,lsl#32 3c:blr x10 40:add x7,x0,#0 x0 eBPF指令0:(18)r1=mapid:1140+0 18 21 00 00 72 00 00 00 00 00 00 00 00 00 00 002:(b4)w2=13 b4 02

14、00 00 0d 00 00 003:(85)call bpf_trace_printk#-122112 85 00 00 00 00 23 fe ff4:(b4)w0=0 b4 00 00 00 00 00 00 005:(95)exit 95 00 00 00 00 00 00 00load prog:special load r1=0libbpf重定向:map_fd+value offsetverifier重写:map value绝对地址get_info返回前重写:map_id+offset clang生成的指令0:18 01 00 00 00 00 00 00 00 00 00 00

15、00 00 00 00 r1=0 ll2:b4 02 00 00 0d 00 00 00 w2=133:85 00 00 00 06 00 00 00 call 64:b4 00 00 00 00 00 00 00 w0=0load prog:helper的唯一idverifier重写:helper相对地址JIT:生成绝对地址ARM64 mov操作立即数有限制:x0 =0 xffff800014c4e000 x10=0 xffff8000103d51d8#grep T bpf_trace_printk/proc/kallsymsffff8000103d51d8 T bpf_trace_prin

16、tk首届中国首届中国eBPFeBPF研讨会研讨会How:支持函数调调用(bpf call)背景 bpf program只支持一个函数,其它函数调用都是always_inline 代码共享,无法实现库 实现 v4.16 Alexei Starovoitov 所有的代码在同一个program,将所有函数虚拟为sub-program 使用 BPF_JMP|BPF_CALL|BPF_PSEUDO_CALL 相对跳转到sub-program 每一个sub-program编译后,都有自己的prologue和epilogue JIT会运行2次:第一次跳转地址为空,第二次跳转到第一次得到的地址首届中国首届中国

17、eBPFeBPF研讨会研讨会How:bpf异常访问访问表 背景 简化代码和性能的考虑:针对BTF类型的指针访问,不需要通过调用bpf_probe_read_kernel等helper,直接读访问 需要保证指针访问安全 实现 v5.9 jean-philippelinaro.org 使用类似copy_to|from_user的机制,运行时做异常处理 对每一次BTF类型的指针解引用,JIT生成对应exception条目 触发异常后,将目标寄存器清零,并跳过解引用指令首届中国首届中国eBPFeBPF研讨会研讨会How:函数调调用+异常访问访问表例子(1)static unsigned int*_no

18、inline get_0th_element(void)int key=0;return bpf_map_lookup_elem(&array,&key);SEC(tp_btf/sched_wakeup_new)int BPF_PROG(test_btf_access,struct task_struct*p)unsigned int*value;value=get_0th_element();if(value)*value=p-_state;return 0;#llvm-objdump-D-z btf_access.bpf.o in section.text0:b4 01 00 00 00

19、00 00 00 w1=01:63 1a fc ff 00 00 00 00*(u32*)(r10-4)=r1.7:95 00 00 00 00 00 00 00 exit in tp_btf/sched0:79 16 00 00 00 00 00 00 r6=*(u64*)(r1+0)1:85 10 00 00 ff ff ff ff call-12:15 00 02 00 00 00 00 00 if r0=0 goto+23:61 61 00 00 00 00 00 00 r1=*(u32*)(r6+0)4:63 10 00 00 00 00 00 00*(u32*)(r0+0)=r15

20、:b4 00 00 00 00 00 00 00 w0=06:95 00 00 00 00 00 00 00 exit相对跳转到.text+0bpf program访问偏移量为0struct task_struct unsigned int _state;_attribute_(preserve_access_index);首届中国首届中国eBPFeBPF研讨会研讨会How:函数调调用+异常访问访问表例子(2)0:(79)r6=*(u64*)(r1+0)1:(85)call pc+5 85 10 05 00 01 00 00 002:(15)if r0=0 x0 goto pc+23:(61)

21、r1=*(u32*)(r6+24)61 61 18 00 00 00 00 004:(63)*(u32*)(r0+0)=r15:(b4)w0=06:(95)exit7:(b4)w1=08:(63)*(u32*)(r10-4)=r1.16:(95)exitlibbpf合并+重定向:85 10 00 00 05 00 00 00libbpf重定向:CO-RE依赖bpf program ELF的.BTF段和.BTF.ext段、内核的BTF信息1.解析ELF文件的.BTF:包含task_struct的BTF定义2.解析ELF文件的.BTF.ext:包含重定向的EFL段中需要CO-RE的信息3.在内核B

22、TF信息中匹配:根据名字和类型匹配4.根据找到的内核BTF类型,调整偏移量:对应的BTF类型 id为187#llvm-objcopy-j.BTF-strip-all.#bpftool btf dump file btf_access.btf13 STRUCT task_struct size=4 vlen=1 _state type_id=14 bits_offset=0#bpftool btf dump id 1187 STRUCT task_struct size=4160 vlen=235_state type_id=10 bits_offset=192CO-RE重定位(.BTF.ext

23、)insn_off:24type_id:13access_str:0:0kind:byte offset首届中国首届中国eBPFeBPF研讨会研讨会How:函数调调用+异常访问访问表例子(3);test_btf_access 34:ldr x19,x0 38:mov x10,#0 xffffffffffff81e0 3c:movk x10,#0 x1d6c,lsl#16 40:movk x10,#0 xfe00,lsl#32 44:blr x10 48:add x7,x0,#0 x0 4c:cmp x7,#0 x0 50:b.eq 0 x000000000000005c 54:ldr w0,x

24、19,#24 58:str w0,x7 5c:mov w7,#0 x0verifier重写为:85 10 10 00 01 00 00 00 JIT:根据off得到subprog的绝对地址x10=0 xfffffe001d6c81e0;get_0th_element(void)30:mov w0,#0 x0 34:mov x10,#0 xfffffffffffffffc 38:str w0,x25,x10 3c:add x1,x25,#0 x0 40:sub x1,x1,#0 x4verifier重写指令:BPF_LDX|BPF_PROBE_MEM|BPF_WJIT添加异常向量表:insn:相

25、对异常条目的异常地址offset:相对异常条目的返回地址fixup:需要被清0的寄存器首届中国首届中国eBPFeBPF研讨会研讨会How:原子操作 背景 在bpf program中生成全局唯一的cookie 实现 v5.12 v5.18 在ARM64添加更多atomic操作的支持 atomic64_add(已支持)atomic64_fetch_add:src_reg=atomic_fetch_add(dst_reg+off,src_reg)atomic64_fetch_and,or,xor atomic64_xchg|cmpxchg:r0=atomic_cmpxchg(dst_reg+off,

26、r0,src_reg)将原子操作翻译为ARM64上原子操作,如果不支持LSE原子指令扩展,使用LL-SC循环实现原子操作首届中国首届中国eBPFeBPF研讨会研讨会How:kfunc(unstable helper)背景 在bpf program中复用内核函数(bpf-tcp-cc场景)bpf helpers需要保证ABI兼容,提供一种不需要ABI兼容的helper 实现:v5.13 Martin KaFai Lau 不同的prog类型不同类型的kfunc set 依赖于内核支持BTF和JIT 当前kfunc的最大参数为5个 使用BPF_JMP|BPF_CALL|BPF_PSEUDO_KFUN

27、C_CALL 实现函数调用 JIT的实现和bpf call类似首届中国首届中国eBPFeBPF研讨会研讨会How:原子操作+kfunc的例子(1);kfunc_demo 5:(b4)w2=3 6:(18)r1=mapid:1290+0 8:(c3)r2=atomic_fetch_add(u32*)(r1+0),r2)c3 21 00 00 01 00 00 00 9:(63)*(u32*)(r1+0)=r2 10:(bf)r1=r0 11:(b7)r3=2 12:(b4)w4=4 13:(b7)r5=8 14:(85)call bpf_kfunc_call_test1#9098808 85 2

28、0 00 00 38 d6 8a 00 60:mov w1,#0 x3 64:mov x0,#0 xffff000000000000 68:movk x0,#0 xfe00,lsl#32 6c:movk x0,#0 x2c3b,lsl#16 70:ldaddal w1,w1,x0 74:str w1,x0 78:add x0,x7,#0 x0 .88:mov x10,#0 xfffffffffffffe58 8c:movk x10,#0 x8bb,lsl#16 90:movk x10,#0 xfe00,lsl#32 94:blr x10 98:add x7,x0,#0 x0libbpf重定向:

29、imm=BTF idverifier重写:kfunc相对地址JIT:翻译为绝对地址x10:0 xfffffe0008bbfe58首届中国首届中国eBPFeBPF研讨会研讨会How:bpf trampoline 背景 tracing场景。大多数使用kprobe 跟踪函数的开始和结束,但是性能相对差和kretprobe无法同时获取函数参数和返回值 bpf program场景。使用bpf program跟踪或者替换另一个bpf program 实现 v5.5 astkernel.org v6.0 在任意内核函数中调用bpf program ARM64 当前只支持在bpf program上启用bpf trampoline 在bpf program最前面和最后面都预留8个字节 前面:跳转到bpf trampoline、后面:支持=128MB的跳转首届中国首届中国eBPFeBPF研讨会研讨会Where-Todo for ARM64 eBPF JIT bpf trampoline 支持内核函数、支持模块函数 调测信息?bpf pack allocator 指令优化?首届中国首届中国eBPFeBPF研讨会研讨会Thanks!2024-5-

友情提示

1、下载报告失败解决办法
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站报告下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。

本文(6.ARM64 eBPF JIT现状介绍.pptx)为本站 (张5G) 主动上传,三个皮匠报告文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三个皮匠报告文库(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。
客服
商务合作
小程序
服务号
会员动态
会员动态 会员动态:

wei**n_...  升级为高级VIP 135**09...  升级为至尊VIP 

微**... 升级为标准VIP wei**n_...  升级为标准VIP

 wei**n_... 升级为标准VIP wei**n_... 升级为至尊VIP

wei**n_...  升级为至尊VIP wei**n_...  升级为标准VIP

138**02...  升级为至尊VIP 138**98...  升级为标准VIP

 微**... 升级为至尊VIP wei**n_... 升级为标准VIP 

 wei**n_...  升级为高级VIP wei**n_...   升级为高级VIP

wei**n_...  升级为至尊VIP 三**...  升级为高级VIP

186**90... 升级为高级VIP  wei**n_... 升级为高级VIP

 133**56... 升级为标准VIP  152**76...   升级为高级VIP

wei**n_... 升级为标准VIP   wei**n_...  升级为标准VIP

  wei**n_... 升级为至尊VIP  wei**n_... 升级为标准VIP

133**18... 升级为标准VIP  wei**n_... 升级为高级VIP

wei**n_... 升级为标准VIP   微**... 升级为至尊VIP 

  wei**n_... 升级为标准VIP wei**n_... 升级为高级VIP 

187**11...  升级为至尊VIP   189**10... 升级为至尊VIP 

188**51... 升级为高级VIP  134**52... 升级为至尊VIP

134**52... 升级为标准VIP  wei**n_... 升级为高级VIP 

 学**... 升级为标准VIP liv**vi... 升级为至尊VIP

 大婷 升级为至尊VIP wei**n_...  升级为高级VIP

 wei**n_... 升级为高级VIP  微**...  升级为至尊VIP

微**... 升级为至尊VIP wei**n_... 升级为至尊VIP  

wei**n_...  升级为至尊VIP  wei**n_... 升级为至尊VIP

战** 升级为至尊VIP   玍子  升级为标准VIP

ken**81...  升级为标准VIP  185**71...   升级为标准VIP

wei**n_...  升级为标准VIP 微**...  升级为至尊VIP 

wei**n_...  升级为至尊VIP  138**73... 升级为高级VIP

138**36...  升级为标准VIP  138**56... 升级为标准VIP

wei**n_...  升级为至尊VIP   wei**n_... 升级为标准VIP 

  137**86... 升级为高级VIP  159**79... 升级为高级VIP

wei**n_...  升级为高级VIP 139**22...  升级为至尊VIP 

 151**96... 升级为高级VIP   wei**n_... 升级为至尊VIP

186**49... 升级为高级VIP 187**87...  升级为高级VIP

wei**n_...   升级为高级VIP wei**n_...  升级为至尊VIP

sha**01... 升级为至尊VIP  wei**n_... 升级为高级VIP 

139**62... 升级为标准VIP  wei**n_... 升级为高级VIP  

跟**...  升级为标准VIP 182**26... 升级为高级VIP

wei**n_...  升级为高级VIP 136**44...  升级为高级VIP

 136**89... 升级为标准VIP   wei**n_... 升级为至尊VIP

wei**n_...  升级为至尊VIP  wei**n_...  升级为至尊VIP

 wei**n_... 升级为高级VIP wei**n_... 升级为高级VIP 

177**45...  升级为至尊VIP   wei**n_... 升级为至尊VIP 

 wei**n_... 升级为至尊VIP   微**... 升级为标准VIP

wei**n_... 升级为标准VIP  wei**n_... 升级为标准VIP 

139**16... 升级为至尊VIP   wei**n_... 升级为标准VIP

wei**n_... 升级为高级VIP 182**00...  升级为至尊VIP

wei**n_...   升级为高级VIP wei**n_...  升级为高级VIP

 wei**n_... 升级为标准VIP 133**67...  升级为至尊VIP 

wei**n_... 升级为至尊VIP  柯平  升级为高级VIP

shi**ey... 升级为高级VIP 153**71...  升级为至尊VIP