eBPF的介绍

eBPF源于早年间的成型于 BSD 之上的传统技术 BPF(Berkeley Packet Filter)。BPF 的全称是 Berkeley Packet Filter,顾名思义,这是一个用于过滤(filter)网络报文(packet)的架构。BPF 是在 1997 年首次被引入 Linux 的,Linux 内核中的报文过滤机制其实是有自己的名字的:Linux Socket Filter,简称 LSF。从 3.15 开始,一个套源于 BPF 的全新设计开始,在3.17被添置到了 kernel/bpf 下。全新设计最终被命名为了 extended BPF(eBPF);为了后向兼容,传统的 BPF 仍被保留了下来,并被重命名为 classical BPF(cBPF)。相对于 cBPF,eBPF 带来的改变可谓是革命性的:一方面,它已经为内核追踪(Kernel Tracing)、应用性能调优/监控、流控(Traffic Control)等领域带来了激动人心的变革;另一方面,在接口的设计以及易用性上,eBPF 也有了较大的改进。

cBPF 所覆盖的功能范围很简单,就是网络监控和 seccomp 两块,数据接口设计的粗放;而 eBPF 的利用范围要广的多,性能调优、内核监控、流量控制什么的,数据接口的多样性设计。

使用eBPF可以做什么?

一个eBPF程序会附加到指定的内核代码路径中,当执行该代码路径时,会执行对应的eBPF程序。鉴于它的起源,eBPF特别适合编写网络程序,将该网络程序附加到网络socket,进行流量过滤,流量分类以及执行网络分类器的动作。eBPF程序甚至可以修改一个已建链的网络socket的配置。XDP工程会在网络栈的底层运行eBPF程序,高性能地进行处理接收到的报文。从下图可以看到eBPF支持的功能,eBPF是一项革命性的技术,可以在Linux内核中运行沙盒程序,而无需更改内核源代码或加载内核模块。通过使Linux内核可编程,基础架构软件可以利用现有的层,从而使它们更加智能和功能丰富,而无需继续为系统增加额外的复杂性层。·

上个图,目前没有看明白

eBFP程序

在很多情况下,不是直接使用eBPF,而是通过Cilium,bcc或bpftrace等项目间接使用eBPF,这些项目在eBPF之上提供了抽象,并且不需要直接编写程序,而是提供了指定基于意图的定义的功能,然后使用eBPF实施。如果不存在更高级别的抽象,则需要直接编写程序。 Linux内核希望eBPF程序以字节码的形式加载。虽然当然可以直接编写字节码,但更常见的开发实践是利用LLVM之类的编译器套件将伪C代码编译为eBPF字节码。

eBPF调用关系(运行架构)

eBPF 项目

bpftrace项目,项目地址

bpftrace是Linux eBPF的高级跟踪语言。它的语言受awk和C以及DTrace和SystemTap等以前的跟踪程序的启发。 bpftrace使用LLVM作为后端将脚本编译为eBPF字节码,并利用BCC作为与Linux eBPF子系统以及现有Linux跟踪功能和连接点进行交互的库。

bcc项目,项目地址

现在可以用 C 来实现 BPF,但编译出来的却仍然是 ELF 文件,开发者需要手动析出真正可以注入内核的代码。这工作有些麻烦,于是就有人设计了 BPF Compiler Collection(BCC),BCC 是一个 python 库,但是其中有很大一部分的实现是基于 C 和 C++的,python实现了对 BCC 应用层接口的封装。使用 BCC 进行 BPF 的开发仍然需要开发者自行利用 C 来设计 BPF 程序——但也仅此而已,余下的工作,包括编译、解析 ELF、加载 BPF 代码块以及创建 map 等等基本可以由 BCC 一力承担,无需多劳开发者费心

Cilium项目,项目地址

Cilium是一个开源项目,提供基于eBPF的联网,安全性和可观察性。它是从头开始专门设计的,旨在将eBPF的优势带入Kubernetes的世界,并满足容器工作负载的新可伸缩性,安全性和可见性要求。

linux核心设计ebpf,Linux eBPF介绍相关推荐

  1. Linux学习笔记5——什么是Linux:Linux 核心版本与 Linux 发布商版本、如何学linux

    一.Linux是什么?它怎么来的? 1,linux是什么? 不用多说,linux就是操作系统,但我在培训的时候讲课的老师强调,linux不是操作系统而是内核,kernel...从操作系统的概念来看,操 ...

  2. linux算法设计,嵌入式Linux平台下随机序列算法设计.doc

    嵌入式Linux平台下随机序列算法设计 嵌入式Linux平台下随机序列算法设计 [摘 要]本文以多媒体播放器的随机不重复播放机能为切入点,针对嵌入式平台实时性要求高,处理速度不够快,但系统存储歌曲量大 ...

  3. 图解linux内核设计艺术,Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理...

    Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理 作者:新设计团队 出版日期:2011年05月 文件大小:29.01M 支持设备: ¥6.00在线试读 适用客户端: 言商书局 iPa ...

  4. linux课程设计网络应用,Linux技术应用课程设计的详细实例资料说明

    本文档的主要内容详细介绍的是Linux技术应用课程设计的详细实例资料说明. 具体要求如下: 1.登录root用户,进入root目录: 2.新建file目录,在file目录下新建以自己拼音命名的文件(两 ...

  5. 基于linux的 设计,基于Linux的智能家居的设计(一)

    本课题主要目的是设计和实现一个基于Linux开发平台的智能家居系统.本系统主要使用PVC板做成的家居模型.本系统硬件使用基于ARM架构的samsung S3C6410芯片做成的OK6410开发板为手持 ...

  6. linux网页设计工具,linux ubuntu 网页设计 网页制作软件工具

    0. Bluefish 是一个基于Gtk的HTML的编辑器,它支持语法加亮,支 持HTML.CSS.JAVASCRIPT.Java server pages (JSP).Python.Perl.SSI ...

  7. arm linux 核心板 制作,Linux下制作给ARM开发板使用的文件系统

    1.Busybox源码请网上自行下载,编译方法请参考百度. 2.交叉编译工具链的设置也请先设置好. 如果以上1.2没有问题,那么可以使用以下脚本,制作一个给ARM开发板使用的文件系统. 可以自行定制使 ...

  8. 基于嵌入式linux电子相册设计,用于LINUX或者嵌入式LINUX的电子相册程序,基于QT开发...

    用于LINUX或者嵌入式LINUX的电子相册程序,基于QT开发,包含源代码和编译好的可执行程序 linux_project\album\album.pro .............\.....\al ...

  9. 【Linux驱动编程】Linux中断上半部和下半部

    前言   cpu在执行程序时,如果有外部中断触发时,如定时器中断.串行总线中断等,cpu停止当前任务从而转去响应中断处理.对于中断函数的处理,原则是尽快处理完事务并退出中断,这一点也比较好理解,尽快处 ...

最新文章

  1. Linux命令行使用matplotlib,报错_tkinter.TclError: no display name and no $DISPLAY environment variable问题解决
  2. 记忆的天空:智能进化三部曲
  3. php ssh2函数,SSH2 函数 - PHP 7 中文文档
  4. ZeroMQ之Publish/Subscribe (Java)
  5. Linux下的OpenSSL编程
  6. ajax实现滚动刷新,jquery如何实现滚动自动加载
  7. vue中style的scoped属性的设计方式
  8. 最优化学习笔记(七)——Levenberg-Marquardt修正(牛顿法修正)
  9. 锤子t1重置后怎么显示无服务器,解决锤子手机smartisanT1关机后无法正常开机(附带刷机教程图文)...
  10. Java中线程出现Exception in thread Thread-0 java.lang.IllegalMonitorStateException异常 解决方法...
  11. JAVA JSP学生助学金管理系统 jsp学生资助管理系统jsp学生管理系统jsp贷款管理系统jsp大学生贷款管理系统
  12. 将SVG 转换为png -- ImageMagick 转换 svg 为透明png 图
  13. RecycleView获取所有的ViewHolder
  14. click事件修改css_CSS Click事件
  15. 【VulnHub靶场】——HARRYPOTTER第一部: ARAGOG (1.0.2)
  16. 远程访问内网服务器使用FRP实现内网穿透
  17. 搭建无广告免费小说网站------简述(一)
  18. c语言if语句教学设计,if语句教学设计
  19. flv.js视频播放库基本用法
  20. 计算机前沿软件应用课程怎么样,信息技术前沿心得体会|信息技术应用心得体会...

热门文章

  1. Codeforces Round #476 (Div. 2)
  2. Atom 编辑器安装 linter-eslint 插件,并配置使其支持 vue 文件中的 js 格式校验
  3. class AT where T:new()相关知识点
  4. 烽火HG220G-U E00L2.03M2000光猫改桥接教程
  5. 使用npm安装一些包失败了的看过来(npm国内镜像介绍)
  6. ios笔记一 追加数据
  7. 转:Oracle中的rownum不能使用大于的问题
  8. jquery 插件开发小组
  9. 移动电话用户突破6亿大关
  10. java如何用异或符号实现两个变量值的交换