前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BPF简介

BPF简介

作者头像
233333
发布2022-05-10 14:18:37
1.4K0
发布2022-05-10 14:18:37
举报

阅读目录

正文

BPF,及伯克利包过滤器Berkeley Packet Filter,最初构想提出于 1992 年,其目的是为了提供一种过滤包的方法,并且要避免从内核空间到用户空间的无用的数据包复制行为。它最初是由从用户空间注入到内核的一个简单的字节码构成,它在那个位置利用一个校验器进行检查 —— 以避免内核崩溃或者安全问题 —— 并附着到一个套接字上,接着在每个接收到的包上运行。几年后它被移植到 Linux 上,并且应用于一小部分应用程序上(例如,tcpdump)。其简化的语言以及存在于内核中的即时编译器(JIT),使 BPF 成为一个性能卓越的工具。

然后,在 2013 年,Alexei Starovoitov 对 BPF 进行彻底地改造,并增加了新的功能,改善了它的性能。这个新版本被命名为 eBPF (意思是 “extended BPF”),与此同时,将以前的 BPF 变成 cBPF(意思是 “classic” BPF)。新版本出现了如映射和尾调用tail call这样的新特性,并且 JIT 编译器也被重写了。新的语言比 cBPF 更接近于原生机器语言。并且,在内核中创建了新的附着点。

感谢那些新的钩子,eBPF 程序才可以被设计用于各种各样的情形下,其分为两个应用领域。其中一个应用领域是内核跟踪和事件监控。BPF 程序可以被附着到探针(kprobe),而且它与其它跟踪模式相比,有很多的优点(有时也有一些缺点)。

另外一个应用领域是网络编程。除了套接字过滤器外,eBPF 程序还可以附加到 tc(Linux 流量控制工具)的入站或者出站接口上,以一种很高效的方式去执行各种包处理任务。这种使用方式在这个领域开创了一个新的天地。

并且 eBPF 通过使用为 IO Visor 项目开发的技术,使它的性能进一步得到提升:也为 XDP(“eXpress Data Path”)添加了新的钩子,XDP 是不久前添加到内核中的一种新式快速路径。XDP 与 Linux 栈组合,然后使用 BPF ,使包处理的速度更快。

甚至一些项目,如 P4、Open vSwitch,考虑 或者开始去接洽使用 BPF。其它的一些,如 CETH、Cilium,则是完全基于它的。BPF 是如此流行,因此,我们可以预计,不久之后,将围绕它有更多工具和项目出现 …

什么是BPF程序:

BPF is a highly flexible and efficient virtual machine-like construct in the Linux kernel allowing to execute bytecode at various hook points in a safe manner.

  1. BPF程序 ----LLVM+Clang----> BPF字节码 ----JIT----> BPF指令集;
  2. BPF架构采用一种新的虚拟机设计,包含支持x86_64, arm64, mips64等架构的指令集,BPF指令集程序可以高效地工作在基于寄存器架构(r0到r10)的CPU上;
  3. Linux内核维护者不断开发hook点,可以在hook点上挂载BPF程序,当hook点对应的事件发生就可以执行BPF程序,BPF程序返回hook点预定义的值,Linux内核再根据返回值执行下一步操作(比如XDP类型的BPF程序挂载在指定的网络接口上,有数据包进入该网络接口,BPF程序对数据包进行解析然后根据协议字段进行判断,如果不符合规则就返回XDP_DROP,Linux内核根据该返回值就会丢弃该数据包)。
image
image

BPF工作原理:

image
image

BPF关键组件:

  • BPF Hooks
image
image
  • BPF映射:
  1. BPF程序和用户空间程序通过BPF映射通信;
  2. BPF映射以键/值保存在内核,可以被任何BPF程序访问,用户空间的程序可以通过文件描述符访问BPF映射
  3. BPF映射类型:BPF映射支持多种数据结构,从而实现内核内部数据的组织以及用户态和内核态的通信,比如哈希表、数组、队列等等
image
image

4. BPF映射用途举例:

1)在BPF程序不中断的情况下修改其运行方式,修改映射中BPF程序访问的配置数据或应用数据,例如黑名单规定的IP列表和域名;

2)运行在内核的BPF程序统计进入指定网络接口的数据包信息,并将统计信息保存到BPF映射,用户态程序可以通过BPF映射获取数据包统计信息;

image
image
  • BPF辅助函数(BPF Helper Function):如其他语言生态会提供丰富的库提供大量的API函数,BPF也包含各种常用的辅助函数,提供操作内核数据和BPF映射的工具类函数;
  1. 优点:通过定义和维护BPF辅助函数,由BPF辅助函数维护者处理Linux内核版本的迭代更新,对开发者透明,形成稳定的API接口;
  2. BPF辅助函数列表:
image
image
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是BPF程序:
  • BPF工作原理:
  • BPF关键组件:
  • 4. BPF映射用途举例:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档