0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

eBPF是什么以及eBPF能干什么

Linux阅码场 来源:演道网 作者:演道网 2021-07-05 15:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、eBPF是什么

eBPF是extended BPF的缩写,而BPF是Berkeley Packet Filter的缩写。对linux网络比较熟悉的伙伴对BPF应该比较了解,它通过特定的语法规则使用基于寄存器的虚拟机来描述包过滤的行为。比较常用的功能是通过过滤来统计流量,tcpdump工具就是基于BPF实现的。而eBPF对它进行了扩展来实现更多的功能。

主要区别如下:

1)允许使用C 语言编写代码片段,并通过LLVM编译成eBPF 字节码;2)cBPF 只实现了SOCKET_FILTER,而eBPF还有KPROBE 、PERF等。3)BPF使用socket 实现了用户态与内核交互,eBPF 则定义了一个专用于eBPF 的新的系统调用,用于装载BPF 代码段、创建和读取BPF map,更加通用。4)BPF map 机制,用于在内核中以key-value 的方式临时存储BPF 代码产生的数据。

对于eBPF可以简单的理解成kernel实现了一个虚拟机机制,将类C代码编译成字节码(后文有详细解释),挂在到内核的钩子上,当钩子被触发时,kernel在虚拟机的“沙盒”中运行字节码,这样既能方便的实现很多功能,也能通过沙箱保证内核的安全性。

二、eBPF能干什么

如果说BPF专注于流量监控,那么eBPF主要专注的是性能领域,通过各种钩子,能在用户空间得到系统各种性能指标。可以大到监控系统整体的统计指标,也可以小到一个系统函数的运行时间。

这里需要提一下开源项目 BPF Compiler Collection (BCC),这是一个很方便的基于eBPF的系统监视工具,下面这张BCC的说明图就能很好的说明我们使用eBPF能够做到的事。BCC在android系统上也可以运行,但是要对系统进行一定程度的修改,后续可能会写单独的文章进行讲解。对于内核开发者我还比较关注怎么自己来实现监控的功能,下文也将做简单的讲解。

从上图,我么可以看到,eBPF几乎能监控系统的所有方面:

1)应用及虚拟机的各种指标2)系统库性能监控3)kernel系统调用性能4)文件系统性能5)网络调用性能6)CPU调度器性能7)内存管理性能8)中断性能

三、eBPF框架

在开始说明之前先解释下eBPF上的名词,来帮忙更好的理解。

1)eBPF bytecode:将C语言写的钩子代码,通过clang编译成二进制字节码,通过程序加载到内核中,钩子触发后在kernel “虚拟机”中运行。2)JIT: Just-in-time compilation,将字节码编译成本地机器码来提升运行速度,和Java中的概念类似。

3)Maps:钩子代码可以将一些统计类信息保存在键值对的map中,来与用户空间程序进行通信,传递数据。

关于eBPF机制详细的讲解网上有很多,这里就不展开了,这里先上一张图,这里包括了使用或者编写ebpf涉及到的所有东西,下面会对这个图进行详细的讲解。

1)foo_kern.c 钩子实现代码,主要负责:

声明使用的Map节点

声明钩子挂载点及处理函数

2)通过LLVM/clang编译成字节码

编译命令:clang --target=bpf

android平台有集成eBPF的编译,后文会提到

3)foo_user.c 用户空间处理函数,主要负责:

将foo_kern.c 编译成的字节码加载到kenel中

读取Map中的信息并处理输出给用户

4)kernel当收到eBPF的加载请求时,会先对字节码进行验证,并通过JIT编译为机器码,当钩子事件来临后,调用钩子函数 kernel会对加载的字节码进行验证,来保证系统的安全性,主要验证规则如下:

a. 检查是否声明了GNU GPL,检查kernel的版本是否支持

b. 函数调用规则:

允许bpf函数之间的相互调用

只允许调用kernel允许的BPF helper函数,具体可以参考linux/bpf.h文件

上述以外的函数及动态链接都是不允许的。

c. 流程处理规则:

不允许使用loop循环以防止进入死循环卡死kernel

不允许有不可到达的分支代码

d. 堆栈大小被限制在MAX_BPF_STACK范围内。

e. 编译的字节码大小被限制在BPF_COMPLEXITY_LIMIT_INSNS范围内。

5)钩子挂载点,主要包括:

另外在kernel的源代码中samples/bpf目录下有大量的示例,感兴趣的可以阅读下。

四、eBPF在Android平台的使用

经过上面枯燥的讲解,大家应该对eBPF有了基础的认识,下面我们就来通过android平台上的一个监控性能的小例子来实操下。

这个小例子的需求是统计系统中每个应用在一段时间内系统调用的次数。

1. android系统对eBPF的编译支持

目前android编译系统已经对eBPF进行了集成,通过android.bp就能很方便的在android源代码中编译eBPF的字节码。

android.bp示例:

相关的编译代码在soong的bpf.go,虽然google关于soong的文档很少,但是至少代码是比较清晰的。

这里的$ccCmd一般是clang, 所以它的编译命令主要是clang --target=bpf。和普通的bpf编译没有区别。

2. eBPF钩子代码实现

解决了编译问题,下一步我们开始实现钩子代码,我们准备使用tracepoint钩子,首先要找到我们需要的tracepoint函数sys_enter和sys_exit。

函数定义在include/trace/events/syscalls.h文件中

1)sys_enter的trace参数是id 和长度为6的数组。2)sys_exit的trace参数是两个长整形数 id 和ret。

找到了钩子后,下一步就可以编写钩子处理代码了:

1)定义map保存系统调用统计信息,在DEFINE_BPF_MAP声明map的同时,也会生成删,改,查的宏函数,例如本例中会生成如下函数

bpf_pid_syscall_map_lookup_elem

bpf_pid_syscall_map_update_elem

bpf_pid_syscall_map_delete_elem

2)定义回调函数参数类型,需要参考前面的tracepoint的定义。3)指定监听的tracepoint事件。4)使用bpf_trace_printk函数打印debug信息,会直接打印信息到ftrace中。5)在map中查找指定key。6)更新指定的key的值。

3. 加载钩子代码

我们只需要把我们编译出来的*.o文件push到手机的system/etc/bpf目录下,重启手机,系统会自动加载我们的钩子文件,加载成功后会在 /sys/fs/bpf目录下显示我们定义的map及prog文件。

系统加载代码在system/bpf/bpfloader中,代码很简单。

主要有如下操作:

1)在early-init阶段向下面两个节点写1

– /proc/sys/net/core/bpf_jit_enable

使能eBPF JIT,当内核设定BPF_JIT_ALWAYS_ON的时候,默认为1

– /proc/sys/net/core/bpf_jit_kallsyms

使特权用户可以通过kallsyms节点读取kernel的symbols

2)启动bpfloader service

– 读取system/etc/bpf目录下的*.o文件,调用libbpf_android.so中的loadProg函数加载进内核。

– 生成相应的/sys/fs/bpf/节点。

– 设置属性bpf.progs_loaded为1

sys节点分为map节点和prog节点两种, 分别为map_《filename》_《mapname》, prog_《filename》_《mapname》

下面是Android Q版本上的节点信息。

可以使用下面的命令调试动态加载

4. 用户空间程序实现

下面我们需要编写用户空间的显示程序,本质上就是在用户态通过系统调用把BPF map给读出来。

1)eBPF统计只有在调用bpf_attach_tracepoint只有才会起作用。bpf_attach_tracepoint是bcc里面的函数,android将bcc的一部分内容打包成了libbpf,放到了系统库里面。2)取得map的fd, bpf_obj_get会直接调用bpf的系统调用。3)将fd包装成BpfMap,android在BpfMap.h中定义了很多方便的函数。4)遍历map回调函数。返回值必须是android::ok(在android的新版本中已经进行修改)。

5. 运行结果查看

直接在目录下执行mm,将编译出来的bpf.o push到/system/etc/bpf目录下,将统计程序push到/system/bin目录下,重启,看下结果。

前面的是pid, 后面的是系统调用次数。

至此,如何在android平台使用eBPF实现统计系统中每个pid在一段时间内系统调用的次数的功能就介绍完了。

此外还有很多技术细节没有深入研究,不过毕竟只是初探,就先讲到这里了,后续有时间再进一步深入研究。研究的时间还是比较短,如果有任何错误的地方欢迎指正。

参考资料

eBPF 简史 (下篇):

https://cloud.tencent.com/developer/article/1006318

goolge原生使用ebpf的两篇文章:

https://source.android.com/devices/architecture/kernel/bpf

https://source.android.com/devices/tech/datausage/ebpf-traffic-monitor

BCC:

https://github.com/iovisor/bcc

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4423

    浏览量

    67963
  • 代码
    +关注

    关注

    30

    文章

    4981

    浏览量

    74483
  • 编译
    +关注

    关注

    0

    文章

    697

    浏览量

    35314
  • BPF
    BPF
    +关注

    关注

    0

    文章

    26

    浏览量

    4757

原文标题:android平台eBPF初探

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    频谱分析仪是干什么用的

    频谱分析仪是一种专门用于信号分析的精密仪器,其核心功能是将复杂的电信号从“时间域”转换到“频域”进行观察和解析。如果说示波器是观察信号波形变化的“时域之眼”,那么频谱分析仪就是洞察信号频率构成的“频域之眼”。它能够将信号分解为不同频率的正弦波分量,并以图形化的方式展示各频率成分的强度,从而帮助工程师和技术人员深入理解信号的本质。这种独特的能力使其成为通信、电子、音频、航空航天及科研等领域的关键工具。
    的头像 发表于 04-11 15:04 452次阅读
    频谱分析仪是<b class='flag-5'>干什么</b>用的

    Kubernete网络模型的原理和故障排查实践

    在2026年的生产环境中,主流CNI插件形成了清晰的格局:Calico以网络策略(NetworkPolicy)见长,适合安全要求高的环境;Flannel以简单易用著称,适合快速起步;Cilium以eBPF技术带来革命性的性能和安全能力,是2026年的技术热点。
    的头像 发表于 03-31 14:38 162次阅读

    南开大学捅破电池天花板,我们晶振能干什么

    刷新闻刷到它,直接给小编整精神。南开大学和上海空间电源研究所的团队,2月26号在《自然》上发了篇论文——搞出一种新的电解液技术,能让现在的锂电池续航直接翻倍,零下70度还能正常工作。
    的头像 发表于 03-06 16:44 2634次阅读
    南开大学捅破电池天花板,我们晶振<b class='flag-5'>能干什么</b>?

    不间断电源是干什么用的?优比施一文讲透

    ……这些令人懊恼甚至带来损失的瞬间,都与一个词有关——电力中断。而不间断电源,正是为解决这些问题而生。今天,优比施电源用最通俗易懂的方式,为您讲清楚不间断电源到底是干什
    的头像 发表于 03-03 08:48 392次阅读
    不间断电源是<b class='flag-5'>干什么</b>用的?优比施一文讲透

    lora无线数传电台能干什么?5KM数据传输,代替有线485

    双向通信,是工业物联网、智慧农业、智慧城市等场景的“无线串口线”。 一、核心功能(能干什么) 1. 基础通信能力 - 点对点透明传输:两个电台配对,串口数据原样无线转发,替代长距离RS485/232线缆,无需改协议。 - 点对多点/主从组网:一台主机带多台从机,集中
    的头像 发表于 02-28 16:37 790次阅读

    三防漆多久能干

    在电子元器件防护作业中,大家常会遇到一个核心问题:三防漆多久能干?三防漆固化分为表干和完全固化两个阶段——表干是表面不粘手、无明显流淌的状态,完全固化则是漆膜彻底固化,达到最佳防护性能。不同类型的三
    的头像 发表于 02-27 16:00 303次阅读
    三防漆多久<b class='flag-5'>能干</b>?

    新手求问,单片机的引脚为什么要接二极管再接5v?

    如图所示的几个4148是干什么用的
    发表于 01-27 14:42

    相控阵芯片频段到底如何选择

    相控阵技术早已从军事雷达渗透到了卫星通信、雷达感测、气象探测等多个领域。但你知道吗?决定相控阵芯片 “能干什么” 的核心因素,并非算力,而是它工作的频段。
    的头像 发表于 01-26 09:34 883次阅读

    划片机是干什么用的

    划片机是干什么用的?在晶圆加工场景中,它也常被称为晶圆切割机,是半导体制造后道工艺中的核心设备,其核心用途是将完成前道电路制造(如光刻、刻蚀、沉积等)的整片晶圆,沿预设的空白切割道
    的头像 发表于 01-12 16:33 905次阅读
    划片机是<b class='flag-5'>干什么</b>用的

    2.5MW储能干变一体机:开启能源存储与转换新篇章

    自身高效且可靠的性能表现,在集中式大型储能领域脱颖而出,展现出极为显著的优势。接下来,本文将全方位深入探讨这一先进设备的特性、适用场景以及它对能源行业带来的深远影响。 一、2.5MW储能干变一体机的技术特性剖析 2.5MW储能干
    的头像 发表于 09-09 10:46 1622次阅读
    2.5MW储<b class='flag-5'>能干</b>变一体机:开启能源存储与转换新篇章

    加固计算机是用来干什么的?

    加固计算机是一种专门为复杂环境和特殊行业应用设计的高性能设备。它不仅具备常规电脑的数据处理和运算功能,更在结构设计、防护等级和硬件配置方面做了全面优化。例如,它的外壳通常采用镁铝合金或高强度复合材料,具有防尘、防水、防摔的特性,内部还经过防震加固处理,确保在运输、跌落或长时间移动中依旧保持稳定运行。某些加固计算机甚至符合军用标准,能够适应极端环境和高强度任务需求。
    的头像 发表于 08-22 09:55 699次阅读

    基于eBPF的Kubernetes网络异常检测系统

    作为一名在云原生领域深耕多年的运维工程师,我见过太多因为网络问题导致的生产事故。传统的监控手段往往是事后诸葛亮,当你发现问题时,用户已经在抱怨了。今天,我将分享如何利用 eBPF 这一革命性技术,构建一套能够实时检测 Kubernetes 网络异常的系统。
    的头像 发表于 07-24 14:09 983次阅读

    晶振是干什么用的

    在电子设备如繁星般密布于生活各个角落的当今时代,从小巧的智能手表到庞大的服务器,从便捷的手机到家中的智能家电,有一种常常被忽视却起着关键作用的元件——晶振。它体积微小,存在感看似不强,却宛如电子设备的“心脏起搏器”,默默把控着节奏,维系着整个系统稳定、精准地运行。 提供精准时钟信号 晶振最基础且核心的用途,便是生成高度精准的时钟信号。在数字电路的世界里,众多芯片、处理器如同训练有素的士兵,需要依据统一
    的头像 发表于 06-30 10:44 1451次阅读

    光纤odf架干什么用的

    光纤ODF架(Optical Distribution Frame,光纤配线架)是光纤通信网络中用于光纤配线与管理的核心设备,主要承担光纤线路的连接、分配、调度及保护功能。以下从其核心作用、应用场景及技术优势三方面展开说明: 一、核心功能 光纤熔接与端接 提供熔接盘、适配器面板等模块,支持光纤熔接(永久连接)或快速端接(预制成端跳线),实现主干光缆与分支光缆的可靠连接。 类比:如同电路中的“接线板”,将多根光纤有序整合。 线路分配与调度 通过适配器面板
    的头像 发表于 05-21 13:53 2381次阅读
    光纤odf架<b class='flag-5'>干什么</b>用的

    芯片前端设计与后端设计的区别

    前端设计(Front-end Design):聚焦于电路的逻辑功能实现。本质上是在“纸上”设计电路,包括芯片要“干什么”,要“如何运算”。
    的头像 发表于 05-16 14:56 1602次阅读