一文读懂eBPF的前世今生

原创 Linux阅码场 2022-05-24 08:00

Ftrace公开课火热报名中:Ftrace公开课:站在设计者的角度来理解ftrace(限50人)。课程第一期报名已截止且已开课,第二期报名请咨询客服(小月微信:linuxer2016)。




个人简介

宋赛,Linux内核相关技术爱好者。

说明背景

文档作为会议的记录和补充,会议主题为《eBPF技术简介》,主讲人狄卫华

基本内容


BPF技术来自于1993年发表的论文《The BSD packet filter: a new architecture for user-level packet capture》,最初是在内核中使用BPF技术过滤网络数据包来提升性能。通过工作于寄存器结构CPU之上的虚拟机设计和在内核层运行的BPF程序,可以将数据包过滤技术性能提升20倍以上。2014年,Alexei Starovoitov BPF进行改造和功能添加,新版本被命名为 eBPFextended Berkeley Packet Filter)而之前的BPF则被称为cBPF(classic bpf),现在已基本废弃。将eBPF扩展到用户空间的改动,成为了该技术的转折点,使其慢慢演进为一个通用引擎,应用场景逐步扩展到内核各子模块。

eBPF将数据与功能进行分离,数据从用户态加载,功能内置于内核中,使其具有稳定、高效、安全、热加载/卸载、内核内置和VM通用引擎简洁通用的特性。

eBPFLinux内核模块的对比如下:




eBPF工作原理



eBPF基于事件驱动架构,在触发点条件满足时,会触发eBPF程序运行。具体流程如下:

1. 编译:使用LLVM或者GCC将编写的eBPF代码编译称eBPF字节码;

2. 加载:使用加载程序通过bpf()系统调用将字节码加载到内核中;

3. 验证:内核使用验证器(verifier)组件保证执行字节码的安全性,以避免对内核造成灾难,在确认字节码安全后,通过JIT compiler将字节码转换为机器码,保证其高效执行。在将机器码加载到对应的模块执行;

4. 触发运行:在内核对应事件触发时,运行的eBPF字节码程序,可通过map或者perf_event与用户态程序进行数据交互。

 

ebpf程序从编写到加载进内核中运行,我们需要关注的内容包括:eBPF辅助函数、eBPF程序类型、eBPF maps




eBPF辅助函数


考虑安全性的问题,eBPF程序不能随意调用内核函数,因此内核专门提供eBPF程序可以调用的辅助函数。辅助函数与程序类型有强对应关系,不同的程序类型可调用的辅助函数集合不同,这些函数由不同的Linux内核版本引入。


eBPF程序类型


eBPF字节码和eBPF map被加载到内核中是通过bpf()系统调用来实现的。Bpf()的函数声明如下:

int bpf(int cmd, union bpf_attr *attr, unsigned int size);

不同的cmd会执行不同的操作,每种操作需要配置不同的attrsizeattr指向的union的大小。当cmdBPF_PROG_LOAD时,则是加载ebpf程序到内核中,返回与该程序关联的文件描述符,而attr指向的union bpf_attr中需要配置ebpf程序类型。ebpf程序类型定义了eBPF程序可以挂载的事件类型以及事件的参数,也限定了可以访问的辅助函数的集合。常见的程序类型有:

BPF_PROG_TYPE_SOCKET_FILTER

BPF_PROG_TYPE_KPROBE

BPF_PROG_TYPE_SCHED_CLS

BPF_PROG_TYPE_SCHED_ACT


eBPF map


eBPF程序最神奇的功能就是内核运行的代码与加载其的用户空间程序可以通过map机制实现双向通信。eBPF mapkey/value对保存在内核中,可以被任何eBPF程序访问;用户空间程序通过导出的文件描述符进行访问(在bpf()调用创建map时会产生文件描述符)。Map类型支持hasharrayLPMsocket等类型。这些类型是在调用bpf()创建map时配置的。


eBPF程序组成


后端:在内核中加载和运行的eBPF字节码。它将数据写入内核map和环形缓冲区的数据结构中

加载器:它将字节码后端加载到内核中。通常情况下,当加载器进程中止时,字节码会被内核自动卸载

前端:从数据结构中读取数据,并将其显示给用户

数据结构:后端和前端的通信手段。它们是由内核管理的map和环形缓冲区,可以通过文件描述符访问。需要在后端被加载之前创建,数据会持续存在,直到没有更多的后端或前端进行读写操作



 

eBPF的应用场景有哪些


观测和跟踪


eBPF程序附加到跟踪点以及内核和用户应用探针点的能力,使得应用程序和系统本身的运行时行为具有前所未有的可见性。eBPF不依赖于操作系统暴露的静态计数器和测量,而是实现了自定义指标的手机和内核内聚合,并基于广泛的可能来源生成可见性事件。eBPF跟踪架构如下:



跟踪支持的事件包括:

  • Kprobes/kretprobes:实现内核中动态跟踪,可跟踪Linux内核中的函数入口或返回点,非稳定ABI接口

  • Uprobes/uretprobes:用户级别的动态跟踪。与kprobes类似,只是跟踪的函数为用户程序中的函数

  • Tracepoints:内核中静态跟踪。Tracepoints是内核开发人员维护的跟踪点,能够提供稳定的ABI接口,但是由于研发人员维护,数量和场景可能受限

  • perf_events:定时采样和PMC

  • Socket和其他网络hook:网络套接字上执行操作、以及在发送或接收消息时运行eBPF程序。在内核的网络栈中还有称为traffice controltchookeBPF程序可以在初始数据包处理后运行

Linux的不同位置的观测和跟踪,使用的工具不同,BCCBPF Compiler Collection)提供的工具如下图:




网络


可编程性和效率的结合使得eBPF自然而然地满足了网络解决方案的所有数据包处理要求。eBPF的可编程性使其能够在不离开Linux内核的包处理上下文的情况下,添加额外的协议解析器,并轻松编程任何转发逻辑以满足不断变化的需求。JIT编译器提供的效率使其执行性能接近于本地编译的内核代码。

 



eBPF在网络中的应用场景包括:

1. 网络数据包过滤:实现实时流量丢弃和特定条件过滤后数据包

2. TC流量控制:编程网络数据路径cls-bpf分类器。cls-bpf可以将BPF程序直接挂钩到入口和出口层,从而实现对于数据包流入和流出控制

3. XDP:提供了一个仍然基于操作系统内核的安全执行环境,在设备驱动上下文中执行,可用于定制各种包处理应用。常用于三层路由转发、四层负载均衡、DDoS防护、分布式防火墙等。


安全


虽然系统调用过滤、网络级过滤和进程上下文跟踪等方面通常由完全独立的系统处理,但ebpf允许将所有方面的可视性和控制结合起来,以创建更多上下文上运行的、具有更好控制水平的安全系统。应用场景如下:

1. 网络安全策略:云原生场景下的L3/L4/L7层网络安全策略,以Cilium为代表

2. 运行时安全:内核运行时安全检测工具,包括SeccompLSM


软件开发生态


Bpftrace


bpftrace是一种用于eBPF的高级跟踪语言,使用LLVM作为后端,将脚本编译为BPF字节码。


BCC


为了简化BPF程序开发,社区创建了BCC项目:其为编写、加载和运行eBPF程序提供了一个易于使用的框架,除了“限制性C”之外,还可以通过编写简单的pythonLua脚本来实现。BCC提供了大量跟踪和观测工具。


C语言-原生


底层基于libbpf库实现用户态程序的编写和BPF程序的加载


C语言-libbpf-bootstrap


Libbpf-bootstrap是一个脚手架工具,它为初级用户设置了尽可能多的东西,可直接进入编写BPF程序。Libbpf-bootstrap依赖于libbpf并使用一个简单的Makefile

 

Rust


存在一些rust开发库用于开发eBPF


 

Go


用户空间程序用Go语言编写,程序一遍采用静态编译,分发和部署相对方便,如果将BPF编译后的字节码直接内嵌到Go程序中,分发则更加方便。

 

eBPF的未来


内核面临的挑战包括:

·复杂度不断增长,性能和可扩展性新需求

·永远保持向后兼容

·特征渐进式演进

ebpf内核则是完全可编程,安全地可编程。eBPF是内核功能快速迭代和功能更加多样化的基石。

一些问答

1. 学习eBPF需要学习C语言吗?研究cilium源码可行吗?

不一定需要C语言。如果只是使用工具,了解原理不需要学习C。如果要自己写eBPF程序,也可以用一些高级语言特性的语言来编写,不一定用C。

cilium源码有点大,可以找一些小项目,比如说网络安全的Tracee等会更加适合入门。cilium源码不仅讲的eBPF技术,主要讲的在内核里面怎么做网络优化,路径调整,没有网络知识看这个会困难

2. 嵌入式环境有什么工具可以使用吗?

社区有个ply工具,专为 embedded Linux systems 开发

3. eBPF和内核模块的原子性怎么理解

kernel modules加载的过程不是原子性的,可能会导致原有的处理流程被中断。eBPF加载和卸载的过程会保证不会有业务的中断

4. 看Linux内核代码执行流可以用eBPF吗?

可以的,但是有一个更好的工具就是ftrace,eBPF可以找到是谁调用了这个函数。但是函数内部调用了哪些函数是找不到的,可以结合ftrace来拿到完整的执行流

5. eBPF对性能的影响

eBPF是高效精简的,大多数场景下可以忽略对性能的影响。如果附加到的函数事件触发点是内核中调用非常频繁的,会拖慢内核。这本身不是eBPF的问题,是我们使用方式的问题

6. usdt这个工具是怎么使用的?

可以理解是用户空间的trace part,有一些库利用usdt技术在用户空间里面声明出来一些相关的静态点,可以看一下我翻译的书中,有相关的介绍

7. 可以同事挂多个eBPF程序到xdp挂载点吗?

不确定,我理解可以,需要验证一下

8. 应用程序的性能分析有什么建议吗?

可以使用profile来分析生成火焰图,不只有eBPF可以做,perf也有这个能力。主要是perf的数据格式是固定的,没有办法在捕获数据的时候做一些自己的处理。Ebpf可以做一些性能分析的处理逻辑在里面,比如说做一些函数出口和入口的延时。建议看一下《性能之巅》这本书

9. eBPF程序是平台无关的字节码,嵌入式上是否也可以做到跟平台无关?

运行eBPF程序需要访问内核结构,需要保证内核版本一致

10. 基于C语言编写的 eBPF程序,其中的前端在用户空间执行,后端要去内核执行,所以是用 llvm 编译了两次吗?

确实是编译了两次,一次是把程序通过clang编译成了字节码,后续加载到内核中执行。一次是直接编译成elf在用户空间执行





往期精华文章:【精华】Linux阅码场原创精华文章汇总




阅码场付费会员专业交流群

会员招募:各专业群会员费为88元/季度,权益包含群内提问,线下活动8折,全年不定期群技术分享(普通用户直播免费,分享后每次点播价为19元/次),有意加入请私信客服小月(小月微信号:linuxer2016)


专业群介绍:

彭伟林-阅码场内核性能与稳定性
本群定位内核性能与稳定性技术交流,覆盖云/网/车/机/芯领域资深内核专家,由阅码场资深讲师彭伟林主持。


甄建勇-性能优化与体系结构

本群定位Perf、cache和CPU架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师甄建勇主持。


李春良-Xenomai与实时优化

本群定位Xenomai与实时优化技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师李春良和彭伟林共同主持。


周贺贺-Tee和ARM架构

本群定位Tee和ARM架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师周贺贺主持。


谢欢-Linux tracers

本群定位Linux tracers技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师谢欢主持。





Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
评论
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 113浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 103浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 55浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 83浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 170浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 100浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 40浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 63浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 141浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 80浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 71浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 125浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 87浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 180浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 167浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦