《6.eBPF在Android平台的实践.pptx》由会员分享,可在线阅读,更多相关《6.eBPF在Android平台的实践.pptx(60页珍藏版)》请在三个皮匠报告上搜索。
1、首届中国首届中国eBPFeBPF研讨会研讨会eBPF在Android平台的实践首届中国首届中国eBPFeBPF研讨会研讨会一一adeb(android adeb(android debiandebian)二二eBPFeBPF Introduction Introduction三三Android Android eBPFeBPF Implementation Implementation四四BTF(BPF Type Format)BTF(BPF Type Format)五五eBPFeBPF changes for Android changes for Android六六Analyzing is
2、sues with Analyzing issues with eBPFeBPF目目 录录首届中国首届中国eBPFeBPF研讨会研讨会adeb(android adeb(android debiandebian)01adeb (android adeb (android debiandebian)adebadeb又名又名androdebandrodeb,旨在,旨在AndroidAndroid手机上,搭建了一个基于手机上,搭建了一个基于adbadb shell shell命令行的命令行的debiandebian shellshell环境,使得手机可以同时运行环境,使得手机可以同时运行Androi
3、dAndroid系统和系统和DebianDebian系统命令。系统命令。因此可直接运行主流因此可直接运行主流LinuxLinux下的命令行工具,方便我们对下的命令行工具,方便我们对AndroidAndroid系统进行系统进行tracingtracing、debuggingdebugging、profiling.profiling.官方网址官方网址:https:/ Ubuntu Ubuntu 或或 Windows WSL(WSLWindows WSL(WSL建议使用建议使用Ubuntu20.04Ubuntu20.04发行版发行版,version 1,version 1即可即可)平台版本平台版本
4、=Android N(arm64)=Android N(arm64)支持支持 adbadb root“root“userdebuguserdebug版本版本 (强烈建议,强烈建议,debugfsdebugfs依赖依赖)/data/data分区至少拥有分区至少拥有 2GB 2GB 剩余空间剩余空间 4G4G可用内存可用内存 (建议建议)adbadb for for linuxlinux:https:/ busybox.exe shell 来模拟,需要对 adeb 做部分修改适配首届中国首届中国eBPFeBPF研讨会研讨会adebadeb配置及运行配置及运行首届中国首届中国eBPFeBPF研讨会研
5、讨会 Quick Start Quick Start git clone https:/ clone https:/ adebcd adebsudosudo ln-s$(ln-s$(pwdpwd)/adeb/)/adeb/usrusr/bin/adeb/bin/adeb 默认安装方式默认安装方式#安装安装adebadeb环境到已连接环境到已连接adbadb的的AndroidAndroid手机手机 (adeb prepare-archive/path/to/mydeb-fs.tgz)adeb prepareadeb prepare#上述操作会下载和安装基础上述操作会下载和安装基础debiande
6、bian image image,如果要装完整版本请使用,如果要装完整版本请使用adeb prepare-fulladeb prepare-full#安装完成后,运行开启安装完成后,运行开启adeb shelladeb shell环境环境adeb shelladeb shell#卸载卸载adeb removeadeb remove首届中国首届中国eBPFeBPF研讨会研讨会eBPFeBPF Introduction Introduction02eBPFeBPF Introduction Introduction首届中国首届中国eBPFeBPF研讨会研讨会02eBPFeBPF extended
7、Berkeley Packet Filterextended Berkeley Packet FilterBPF BPF 全称全称Berkeley Packet FilterBerkeley Packet Filter,字面意思伯克利包过滤器。早期主要用,字面意思伯克利包过滤器。早期主要用于实现于实现UnixUnix内核网络数据包过滤,发展到现在升级为内核网络数据包过滤,发展到现在升级为 eBPFeBPF,已经演进成为了一套通用,已经演进成为了一套通用执行引擎,提供可基于系统或程序事件高效安全执行特定代码的通用能力,涵盖了性执行引擎,提供可基于系统或程序事件高效安全执行特定代码的通用能力,涵盖
8、了性能分析、系统追踪、网络优化等方面。能分析、系统追踪、网络优化等方面。原来的原来的 BPF BPF 就被称为就被称为cBPFcBPF(classic BPFclassic BPF),目前已基本废弃。),目前已基本废弃。优势优势 强安全:强安全:BPF BPF 验证器验证器(verifier)(verifier)通过沙盒机制检查每个程序,拒绝不安全的代码通过沙盒机制检查每个程序,拒绝不安全的代码高性能:高性能:JITJIT编译保证程序本地运行的高性能编译保证程序本地运行的高性能持续交付:程序可以被无缝替换,并且不影响正在运行的任务持续交付:程序可以被无缝替换,并且不影响正在运行的任务cBPFc
9、BPF vs vs eBPFeBPF首届中国首届中国eBPFeBPF研讨会研讨会struct sock_filter _u16 code;/*Actual filter code*/_u8 jt;/*Jump true*/_u8 jf;/*Jump false*/_u32 k;/*Generic multiuse field*/;code是真实的bpf汇编指令,jt是指令结果为true的跳转,jf是为false的跳转,k是指令的参数,依据指令不同而不同。一个bpf程序编译后就是一个sock_filter的数组。struct bpf_insn _u8 code;/*opcode*/_u8 dst
10、_reg:4;/*dest register*/_u8 src_reg:4;/*source register*/_s16 off;/*signed offset*/_s32 imm;/*signed immediate constant*/;*R0-return value from in-kernel function,and exit value for eBPF prog.*R1-R5 -arguments from eBPF program to in-kernel function*R6-R9 -callee saved registers that in-kernel funct
11、ion will preserve*R10-read-only frame pointer to access stack多个64位寄存器为函数调用,C语言实现提供了方便,增加了众多内核 helper 函数扩展核心功能核心功能首届中国首届中国eBPFeBPF研讨会研讨会BPF HooksBPF HooksBPF钩子,也就是在内核中,哪些地方可以加载BPF程序,目前Linux内核中已经有近10余种的钩子.如下:w kernel functions(kprobes)w userspace functions(uprobes)w system callsw fentry/fexitw tracepo
12、intsw network devices(tc/xdp)w network routesw TCP congestion algorithmsw sockets(data level)w BPF MapBPF Map存储状态数据、与 userspace 交换信息的桥梁。BPF Map可以被bpf程序本身及用户空间访问及操作,利用BPF Map持久化数据,在不丢失重要数据的同时,更新BPF程序逻辑,实现在不同程序之间共享信息,方便收集统计信息。bpf_prog_typebpf_prog_type用途描述用途描述BPF_PROG_TYPE_KPROBE内核动态插桩点hookBPF_PROG_TY
13、PE_TRACEPOINT内核静态跟踪点BPF_PROG_TYPE_PERF_EVENT获取各种硬件、软件 perf eventsBPF_PROG_TYPE_SOCKET_FILTER网络过滤器(cBPF)BPF_PROG_TYPE_SCHED_CLS流量控制分类BPF_PROG_TYPE_XDPXDP(eXpress Data Path)-高效底层网络hook机制bpf_map_typebpf_map_type用途描述用途描述BPF_MAP_TYPE_HASH哈希表类型MAPBPF_MAP_TYPE_ARRAY数组类型BPF_MAP_TYPE_PERF_EVENT_ARRAYperf eve
14、nt ringbuffer,与用户空间传递数据BPF_MAP_TYPE_PERCPU_HASHper cpu 哈希表BPF_MAP_TYPE_PERCPU_ARRAYper cpu 数组BPF_MAP_TYPE_STACK_TRACE使用id索引的调用栈BPF_MAP_TYPE_CGROUP_ARRAY针对cgroup级别的包/进程过滤BCC toolsBCC tools首届中国首届中国eBPFeBPF研讨会研讨会BPF Compiler Collection(BCC)是一套基于eBPF的Linux内核分析、跟踪、网络监控工具集https:/ python wrapper)首届中国首届中国eB
15、PFeBPF研讨会研讨会BCC Reference Guide bcc reference guide bcc python developer tutorial uprobe 用户态探针首届中国首届中国eBPFeBPF研讨会研讨会bpftoolbpftoolbpftracebpftracehttps:/ high-level tracing language for Linux(eBPF)available in recent Linux kernels(4.x+).bpftrace uses LLVM as a backend to compile scripts to BPF-bytec
16、ode and makes use of BCC for interacting with the Linux BPF system.#Print gpu freq changesbpftrace-e tracepoint:kgsl:gpu_frequency printf(%s%d%dn,comm,args-gpu_freq,args-gpu_id);#Show disk I/O size as a histogrambpftrace-e tracepoint:block:block_rq_issue comm=sum(args-bytes);#Read size distribution
17、by process:bpftrace-e kretprobe:vfs_read bytes=lhist(retval,0,2000,200);#Count page faults by processbpftrace-e software:faults:1 comm=count();#Count cache misses by process name and PID(uses PMCs):bpftrace-e hardware:cache-misses:1000000 comm,pid=count();#See who create threads in launcher processb
18、pftrace-e tracepoint:task:task_newtask/pid=$1/printf(%d%s%sn,tid,comm,ustack();pidof com.android.launcherbpftrace Cheat Sheetbpftracebpftrace one-line command one-line command首届中国首届中国eBPFeBPF研讨会研讨会Android Android eBPFeBPF ImplementationImplementation03Android Android eBPFeBPF ImplementationImplement
19、ation首届中国首届中国eBPFeBPF研讨会研讨会03AndroidAndroid从从9.0(P)9.0(P)版本开始支持版本开始支持eBPFeBPF,其主要用于,其主要用于frameworkframework中的流量统计、网络过滤,中的流量统计、网络过滤,CPU/IO/CPU/IO/内存等模块内存等模块的状态监控。的状态监控。缺点:系统自带的缺点:系统自带的bpfbpf程序在程序在HOSTHOST端交叉编译,端交叉编译,devicesdevices端无端无llvmllvm及及kernel headerskernel headers支持,支持,kprobekprobe支持很受限。支持很受限
20、。system/bpf/bpfloader,system/bpf/libbpf_android 系统启动时负责加载/system/etc/bpf 中的bpf目标文件,create and pin maps and progsbpfloaderbpfloader external/bcc 仅集成libbpf.c、perf_reader.c,为loader/framework程序提供bpf_*相关api,封装load/pin/attach/map等bpf系统调用接口libbpf_bcclibbpf_bcc external/libbpf(13+)libbpf_minimal仅为loader/cli
21、ent程序封装bpf相关api;提供btfloader静态链接完整功能版libbpf/libelf/libz,为支持BTF而生libbpflibbpf bcc cc_library name:libbpf_bcc,host_supported:false,target:android:srcs:,shared_libs:libbpf_minimal,cflags:-DHAVE_EXTERNAL_LIBBPF,-D,cc_binary name:btfloader,srcs:android/btfloader.cpp,static_libs:libbpf,cc_library_static na
22、me:libbpf,host_supported:true,srcs:,static_libs:,cc_library name:libbpf_minimal,srcs:,bpfloaderbpfloader 加载流程加载流程首届中国首届中国eBPFeBPF研讨会研讨会loadAllElfObjects/system/etc/bpf/*.o loadProg/system/etc/bpf/*.o readSection:critical、license、readSection&check bpfloader_*_versize_of_bpf_map|prog_def#read all code
23、 data in progs section readCodeSections createMaps foreach maps section getMapBtfInfo(btfloader)bpf_create_map pin map to /sys/fs/bpf/map_ applyMapRelo loadCodeSections foreach codeSections bpf_prog_load pin prog to /sys/fs/bpf/prog_ SetProperty bpf.progs_loaded=1 bpfloader usage首届中国首届中国eBPFeBPF研讨会研
24、讨会BTF(BPF Type Format)BTF(BPF Type Format)04BTF(BPF Type Format)BTF(BPF Type Format)BCCBCC缺点:缺点:1.1.编译时依赖编译时依赖 kernel headerskernel headers,需要,需要 llvmllvm/clang/clang 工具;工具;2.kernel struct 2.kernel struct 定义变更引起定义变更引起 memory layoutmemory layout变化,导致编译生成的变化,导致编译生成的bpfbpf程序无法兼容程序无法兼容不同不同 kernelkernel,
25、不利于,不利于bpfbpf二进制程序分发二进制程序分发BTF BTF 引入了灵活的动态解析机制,对引入了灵活的动态解析机制,对structstruct成员进行动态定位,基于成员进行动态定位,基于kernelkernel提供的提供的BTFBTF机制,机制,结合结合 libbpflibbpf 与与 bpftoolbpftool,可将,可将 bpfbpf 程序与用户态程序编译封装至单个程序与用户态程序编译封装至单个 ELF ELF 文件,实现文件,实现 CO-RE(Compile Once,Run Everywhere)CO-RE(Compile Once,Run Everywhere)。首届中国首
26、届中国eBPFeBPF研讨会研讨会04BTF support in Android TBTF support in Android T(Android emulator with kernel 5.15)(Android emulator with kernel 5.15)首届中国首届中国eBPFeBPF研讨会研讨会emu64xa:/$zcat/proc/config.gz|grep-E BTF|BPFCONFIG_BPF=yCONFIG_HAVE_EBPF_JIT=yCONFIG_ARCH_WANT_DEFAULT_BPF_JIT=yCONFIG_BPF_SYSCALL=yCONFIG_BP
27、F_JIT=yCONFIG_BPF_JIT_ALWAYS_ON=yCONFIG_BPF_JIT_DEFAULT_ON=yCONFIG_CGROUP_BPF=yCONFIG_NETFILTER_XT_MATCH_BPF=yCONFIG_NET_CLS_BPF=yCONFIG_NET_ACT_BPF=yCONFIG_BPF_LIRC_MODE2=yCONFIG_DEBUG_INFO_BTF=yCONFIG_PAHOLE_HAS_SPLIT_BTF=yCONFIG_DEBUG_INFO_BTF_MODULES=yCONFIG_MODULE_ALLOW_BTF_MISMATCH=yCONFIG_BPF
28、_EVENTS=yemu64xa:/#ls-1/sys/kernel/btf/*/sys/kernel/btf/usbip_core/sys/kernel/btf/vkms/sys/kernel/btf/vmlinux/sys/kernel/btf/zram/sys/kernel/btf/zsmalloc.bpfbpf program with BTF support program with BTF support首届中国首届中国eBPFeBPF研讨会研讨会objdump-h runqlen.orunqlen.bpf.crunqlen_bpf_open /runqlen.skel.hrunq
29、len_bpf_load /runqlen.skel.hopen_and_attach_perf_event +perf_event_open +bpf_program_attach_perf_event /libbpfprint_linear_histsrunqlen_bpf_destroy /runqlen.skel.h runqlen.c client program with btf support BTFGenBTFGen-No kernel BTF support-No kernel BTF support (kernel version 5.15)(kernel version
30、/sys/kernel/tracing05selinuxselinux policies policies首届中国首届中国eBPFeBPF研讨会研讨会eBPFeBPF Traffic Monitoring Traffic Monitoringhttps:/ From Android 9+The is replacing the module and the module it is based on.socket taggingsocket taggingstatic int write_ctrl(const char*cmd)fd=open(/proc/net/xt_qtaguid/ctrl
31、,.);res=write(fd,cmd,strlen(cmd);int qtaguid_tagSocket(int sockfd,int tag,uid_t uid)char lineBuf128;uint64_t kTag=(uint64_t)tag 32);snprintf(lineBuf,sizeof(lineBuf),t%d%PRIu64%d,sockfd,kTag,uid);write_ctrl(lineBuf);BpfMap mCookieTagMap;mCookieTagMap.init(/sys/fs/bpf/netd_shared/map_netd_cookie_tag_m
32、ap)int BpfHandler:tagSocket(int sockFd,uint32_t tag,uid_t chargeUid,uid_t realUid)mCookieTagMap.writeValue(sock_cookie,newKey,BPF_ANY);int qtaguid_tagSocket(int sockfd,int tag,uid_t uid)return netdHdTagSocket(sockfd,tag,uid);CODE REFERENCEusdtusdt|systracesystrace/perfettoperfetto syscallsyscall arg
33、sargs in arm64 in arm64#bpftrace-e kprobe:_arm64_sys_kill printf(%d%s%d%dn,pid,comm,arg0,arg1);Attaching 1 probe.31251 sh 829931184 829931184?#bpftrace-e kprobe:_arm64_sys_kill printf(%d%s%d%dn,pid,comm,*(uint64*)arg0,*(uint64*)arg0+1);Attaching 1 probe.31251 sh 22895 3ustackustack issue(adeb issue(
34、adeb环境环境)#file/apex/com.android.runtime/lib64/bionic/libc.so#file/apex/com.android.runtime/lib64/bionic/libc.so (not stripped(not stripped 意味着还可以使用意味着还可以使用uprobeuprobe)/apex/com.android.runtime/lib64/bionic/libc.so:ELF 64-bit LSB shared object,ARM aarch64,version 1 (SYSV),dynamically linked,BuildIDm
35、d5/uuid=59222d1015276d9a9031ee1ea28c0bcd,not not strippedstripped#file/system/framework/oat/arm64/#file/system/framework/oat/arm64/oplus-services.odexoplus-services.odex/system/framework/oat/arm64/oplus-services.odex:ELF 64-bit LSB shared object,ARM aarch64,version 1(GNU/Linux),dynamically linked,Bu
36、ildIDsha1=8564bd48a484a18502f34962b3f09573e6fee5ad,strippedstripped/usr/lib/debug/.build-id/buildid0buildid1/buildid+2.debugAndroid.odex.note.gpu.build-id.rodata.text.bss.dex.dynstr.dynsym.hash.dynamic.gnu_debugdata.shstrstabunxz首届中国首届中国eBPFeBPF研讨会研讨会Analyzing issues with Analyzing issues with eBPFe
37、BPF06Analyzing issues with Analyzing issues with eBPFeBPF06/*cgroup_mutext.bt cgroup_mutext.bt*/private boolean isForegroundApp(int pid)-return(getSchedGroup(pid)=PROCESS_STATUES_TOP)&)+return(mForegroundFlag=PROCESS_STATUES_TOP)&一一adeb(android adeb(android debiandebian)二二eBPFeBPF Introduction Introduction三三Android Android eBPFeBPF Implementation Implementation四四BTF(BPF Type Format)BTF(BPF Type Format)五五eBPFeBPF changes for Android changes for Android六六Analyzing issues with Analyzing issues with eBPFeBPF总总 结结Thanks