Files
LDD-LinuxDeviceDrivers/study/kernel/00-DESCRIPTION/BPF.md
T

48 KiB
Raw Blame History

title, date, author, tags, categories, thumbnail, blogexcerpt
title date author tags categories thumbnail blogexcerpt
BPF 子系统 2021-02-15 00:32 gatieme
linux
tools
技术积累
虚拟化 & KVM 子系统

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作

知识共享许可协议

因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 鄙人在此谢谢啦

转载请务必注明出处, 谢谢, 不胜感激


日期 作者 GitHub CSDN BLOG
2021-02-15 成坚-gatieme AderXCoding/system/tools/fzf 使用模糊搜索神器 FZF 来提升办公体验 Using FZF to Improve Productivit

2 BPF 系统

--------------- 重要功能和时间点 ---------------**

下文将按此目录分析 Linux 内核中 MM 的重要功能和引入版本:

--------------- 正文 ---------------**

1 概述


eBPF kernel-versions.md

BPF的可移植性和CO-RE (Compile Once Run Everywhere)

BCC和libbpf的转换

Libbpf-tools —— 让 Tracing 工具身轻如燕

BCC & libbpf

使用 bpftrace 分析内核

狄卫华--eBPF 技术全面介绍 -- 历史、现在、未来(阅码场--直播回放), 直播视频解读 一文读懂 eBPF 的前世今生

bpftrace Cheat Sheet

Standardizing BPF

2 工作流程


2.1 编译器


自 2019 年 5 月以来, Oracle 一直计划在 GCC 10 中引入 eBPF 后端, 以使 GNU 编译器成为通用内核虚拟机. Oracle 为 GCC 引入 eBPF 支持的倾向是该公司在 Linux 上改进 DTrace 的努力的一部分. 作为编译目标, eBPF 因内核验证器施加的限制而不同, 并且由于架构的安全驱动设计. 目前, 只要违反 eBPF 限制, 后端就会发出错误. 这增加了内核验证器可以接受结果对象的机会, 从而缩短了开发周期. 参见 .

GCC 的支持 eBPF 经过了 3 个阶段.

  1. 首先在 toolchain 里添加 BPF 的最基本的支持, 将 BPF target 添加到 GNU toolchain, 包括 binutils 支持 BPF, 以及让 GCC 能支持一个新的 bpf-unknown-none 的 target.

  2. 确保生成的程序能够被内核里的 BPF verifier 验证通过, 从而允许加载到内核中.

  3. 最后一个阶段是为 BPF 开发者提供额外工具. 除了编译器和汇编器(compiler and assembler)之外, 还需要调试器和模拟器(debuggers and simulators). 例如 BPF 的 simulator, 用来在 user space 运行, 可以通过 GDB 来调试 BPF program. BPF 就像是某种类型的嵌入式平台一样, 需要针对这种平台创建各种工具才能让普通开发者正常进行开发.

日期 LWN 翻译
2019/09/27 Compiling to BPF with GCC LWN:使用 GCC 编译生成 BPF 程序
2020/09/25 BPF in GCC LWNGCC 也支持 BPF 了!

GCC-DOC 3.19.14 eBPF Options

时间 作者 特性 描述 是否合入主线 链接
2019/08/14 "Jose E. Marchesi" <jose.marchesi-AT-oracle.com> eBPF support for GCC GCC 支持 eBPF v1 ☐ LWN

2.2 加载器


Alexei Starovoitov 在 v3.18 BPF syscall, maps, verifier, samples, llvm 实现最早的 BPF 支持的时候, 引入了一个 mini eBPF library.

紧接着 v3.19 就基于 mini eBPF library 为 samples/bpf 样例实现了一个简单的 BPF 加载器 bpf_load. 参见 samples: bpf: elf_bpf file loader. 随后 Add eBPF hooks for cgroups 为 mini eBPF library 实现了 bpf_prog_attach 和 bpf_prog_detach.

git log --oneline -- samples/bpf/libbpf.c samples/bpf/libbpf.h
git log --oneline -- samples/bpf/bpf_load.c samples/bpf/bpf_load.h
时间 作者 特性 描述 是否合入主线 链接
2014/08/13 Alexei Starovoitov ast@plumgrid.com bpf: mini eBPF library, test stubs and verifier testsuite BPF syscall, maps, verifier, samples, llvm 的其中一个补丁, 引入了 mini eBPF library. v1 ☑✓ 3.18-rc1 LORE v4,00/26
-------
LORE v11,00/12
2014/11/26 Alexei Starovoitov ast@plumgrid.com samples: bpf: elf_bpf file loader allow eBPF programs to be attached to sockets 的其中一个补丁. 基于 mini bpf library, 实现了一个简易的加载器 bpf_load, 其主要接口为 load_bpf_file() -=> load_and_attach(). v1 ☑✓ 3.19-rc1 LORE v1,0/6
-------
LORE v2,0/6
2015/07/01 Wang Nan wangnan0@huawei.com perf tools: filtering events using eBPF programs perf 支持 eBPF, 其中引入了一个 libbpf 的用户态工具. v10 ☑✓ 4.3-rc1 LORE v10,0/50
-------
PULL, 00/31
2016/12/14 Joe Stringer joe@ovn.org Reuse libbpf from samples/bpf 内核主线中同时实现了两套 libbpf 的用户态库 libbpf(位于 tools/lib/bpf) 和 mini bpf lib(用于 samples 样例, 位于 samples/bpf/libbpf.c), 这是非常冗余的, 因此为 tools/lib/bpf 下的 libbpf 实现了 samples/bpf 所需的 bpf wrapper function, 从而使 samples 可以直接使用 libbpf. v1 ☑✓ 4.10-rc1 LORE v1,0/5
2018/05/14 Jakub Kicinski jakub.kicinski@netronome.com samples: bpf: fix build after move to full libbpf mini bpf lib 最终寿终正寝, 只包含了一个 filter.h 的 instruction helpers, 因此被重命名为 bpf_insn.h. v2 ☐☑✓ LORE v2,0/5
2020/11/24 Daniel T. Lee danieltimlee@gmail.com bpf: remove bpf_load loader completely 将使用 bpf_load 编写的BPF程序重写为使用 libbpf 加载器. 使用 libbpf 重构剩余的 bpf 程序, 并完全删除 bpf_load 这个过时的 bpf 加载器, 它已经很难跟上最新的内核 bpf. v3 ☐☑✓ LORE v3,0/7

2.3 验证器


2.4 执行器


2.5 JIT


时间 作者 特性 描述 是否合入主线 链接
2011/04/03 Eric Dumazet eric.dumazet@gmail.com net: filter: Just In Time compiler TODO v2 ☐☑✓ 3.5-rc1 LORE
2011/04/03 Eric Dumazet eric.dumazet@gmail.com net: filter: Just In Time compiler for sparc TODO v2 ☐☑✓ 3.5-rc1 LORE
2014/07/08 Zi Shen Lim zlim.lnx@gmail.com arm64: eBPF JIT compiler TODO v1 ☑✓ 3.18-rc1 LORE
-------
LORE v2
-------
LORE 00/14

3 BPF Core


3.1 eBPF support


v3.15 对 BPF 进行了升级扩展, 参见 BPF updates.

eBPF 已经是一个独立的模块了, 因此后来 3.18 直接将 eBPF 从 NET 子系统中分离出来. 参见 bpf: split eBPF out of NET.

BPF 数据传递的桥梁 ——BPF Map(一)

时间 作者 特性 描述 是否合入主线 链接
2014/03/28 Daniel Borkmann dborkman@redhat.com BPF updates 支持 eBPF v1 ☑✓ 3.15-rc1 LORE 0/9
-------
LORE v2,0/9
-------
LORE v3,0/9
-------
LORE v4,0/9
2014/09/04 Alexei Starovoitov ast@plumgrid.com net: filter: add "load 64-bit immediate" eBPF instruction 添加 BPF_LD_IMM64 指令, 将 64 位立即数加载到寄存器中. v1 ☑✓ 3.18-rc1 LORE 0/2
2014/10/23 Alexei Starovoitov ast@plumgrid.com bpf: split eBPF out of NET TODO v1 ☐☑✓ 3.18-rc3 LORE

随后 Alexei Starovoitov 实现了 v3.18 BPF syscall, maps, verifier, samples, llvm. 这是一组比较大的补丁, 最终在 v3.18, v3.19 分批合入.

v3.18 合入了 bpf 系统调用 bpf: introduce BPF syscall and maps, 并为 eBPF 程序设计了 Verifier bpf: verifier (add verifier core).

紧接着就增加了一些 sample 样例程序供大家参考. BPF samples

v3.19 支持了 MAP, BPF maps.

时间 作者 特性 描述 是否合入主线 链接
2014/08/13 Alexei Starovoitov ast@plumgrid.com BPF syscall, maps, verifier, samples, llvm NA v1 ☑✓ 3.18-rc1 LORE v4,00/26
-------
LORE v11,00/12
2014/08/13 Alexei Starovoitov ast@plumgrid.com BPF samples NA v1 ☑✓ 3.18-rc1 LORE v4,00/26
2014/08/13 Alexei Starovoitov ast@plumgrid.com BPF maps NA v1 ☑✓ 3.19-rc1 LORE v4,00/26
时间 作者 特性 描述 是否合入主线 链接
2021/03/31 Cong Wang xiyou.wangcong@gmail.com bpf: introduce bpf timer TODO v1 ☐☑✓ LORE
2021/11/02 Joe Burton jevburton.kernel@gmail.com Introduce BPF map tracing capability TODO v3 ☐☑✓ LORE v3,0/3
2022/05/18 Benjamin Tissoires benjamin.tissoires@redhat.com Introduce eBPF support for HID devices TODO v5 ☐☑✓ LORE v5,0/17

3.2 BPF_CMD


commit 3007098494be ("cgroup: add support for eBPF programs")

commit f4324551489e ("bpf: add BPF_PROG_ATTACH and BPF_PROG_DETACH commands")

3.3 BPF_PROG_TYPE AND BPF_ATTACH_TYPE


git grep -W 'bpf_prog_type {' include/uapi/linux/bpf.h

BPF 程序类型及其原理s

3.3.1 SOCKET


enum bpf_prog_type VERSION COMMIT
BPF_PROG_TYPE_SOCKET_FILTER
enum bpf_prog_type enum bpf_attach_type VERSION COMMIT
BPF_PROG_TYPE_SOCKET_FILTER NA v3.19 allow eBPF programs to be attached to sockets
BPF_PROG_TYPE_CGROUP_SKB BPF_CGROUP_INET_INGRESS
BPF_CGROUP_INET_EGRESS
v4.10 bpf: add new prog type for cgroup socket filtering
BPF_PROG_TYPE_CGROUP_SOCK BPF_CGROUP_INET_SOCK_CREATE v4.10 bpf: Add new cgroup attach type to enable sock modifications
BPF_PROG_TYPE_CGROUP_SOCK_ADDR BPF_CGROUP_INET4_BIND
BPF_CGROUP_INET6_BIND
v4.17 bpf: Hooks for sys_bind
BPF_PROG_TYPE_CGROUP_SOCK_ADDR BPF_CGROUP_INET4_CONNECT
BPF_CGROUP_INET4_CONNECT
v4.17 bpf: Hooks for sys_connect
BPF_PROG_TYPE_CGROUP_SOCK BPF_CGROUP_INET4_POST_BIND
BPF_CGROUP_INET6_POST_BIND
v4.17 bpf: Post-hooks for sys_bind
BPF_PROG_TYPE_CGROUP_SOCK_ADDR BPF_CGROUP_UDP4_SENDMSG
BPF_CGROUP_UDP6_SENDMSG
v4.18 bpf: Hooks for sys_sendmsg
BPF_PROG_TYPE_CGROUP_SOCK_ADDR BPF_CGROUP_UDP4_RECVMSG
BPF_CGROUP_UDP6_RECVMSG
v5.6 bpf: fix unconnected udp hooks
BPF_PROG_TYPE_CGROUP_SOCK_ADDR BPF_CGROUP_INET4_GETPEERNAME
BPF_CGROUP_INET6_GETPEERNAME
BPF_CGROUP_INET4_GETSOCKNAME
BPF_CGROUP_INET6_GETSOCKNAME
v5.8 bpf: Add get{peer, sock}name attach types for sock_addr
BPF_PROG_TYPE_CGROUP_SOCK BPF_CGROUP_INET_SOCK_RELEASE v5.9 bpf: Add BPF_CGROUP_INET_SOCK_RELEASE hook
时间 作者 特性 描述 是否合入主线 链接
2014/11/26 Alexei Starovoitov ast@plumgrid.com allow eBPF programs to be attached to sockets 引入可以通过 setsockopt() 附加到套接字的 BPF_PROG_TYPE_SOCKET_FILTER 类型的 eBPF 程序. 允许这些程序通过查找/更新/删除助手访问 MAPs. v1 ☑✓ 3.19-rc1 LORE v1,0/6
-------
LORE v2,0/6
2016/11/23 Daniel Mack daniel@zonque.org Add eBPF hooks for cgroups eBPF 程序支持 attach 到 cgroup v9 ☑✓ 4.10-rc1 LORE v9,0/6
2016/12/01 David Ahern dsa@cumulusnetworks.com net: Add bpf support for sockets eBPF 程序支持 attach 到 socket v7 ☑✓ 4.10-rc1 LORE v7,0/6
2018/03/13 Alexei Starovoitov ast@kernel.org bpf: introduce cgroup-bpf bind, connect, post-bind hooks eBPF 程序支持 attach 到 syscal bind 和 conntect. v1 ☑✓ 4.17-rc1 LORE v1,0/6
-------
LORE v2,0/9
-------
LORE v3
2018/05/25 Andrey Ignatov rdna@fb.com bpf: Hooks for sys_sendmsg eBPF 程序支持附加到 sendmsg SYSCALL. v4 ☑✓ 4.18-rc1 LORE v4,0/6
2019/06/07 Daniel Borkmann daniel@iogearbox.net Fix unconnected bpf cgroup hooks eBPF 程序支持附加到 recvmsg SYSCALL. v3 ☑✓ 5.2-rc6 LORE v3,0/6
2020/05/19 Daniel Borkmann daniel@iogearbox.net Add get{peer,sock}name cgroup attach types 为 BPF sock_addr 程序添加 get {peer,sock} name cgroup 类型, 以便从两个调用以及 libbpf 和 bpftool 支持以及自检中重写 sockaddr structs. v2 ☑✓ 5.8-rc1 LORE v2,0/4
2020/07/06 Stanislav Fomichev sdf@google.com bpf: add BPF_CGROUP_INET_SOCK_RELEASE hook 添加 BPF_CGROUP_INET_SOCK_RELEASE. v4 ☑✓ 5.9-rc1 LORE v4,0/4

3.3.2 CGROUP


commit 3007098494be ("cgroup: add support for eBPF programs")

时间 作者 特性 描述 是否合入主线 链接
2016/11/23 Daniel Mack daniel@zonque.org Add eBPF hooks for cgroups TODO v9 ☑✓ 4.10-rc1 LORE v9,0/6

3.3.3 BPF_PROG_TYPE_KPROBE


enum bpf_prog_type enum bpf_attach_type VERSION COMMIT
BPF_PROG_TYPE_KPROBE NA v4.1 commit 2541517c32be ("tracing, perf: Implement BPF programs attached to kprobes")
时间 作者 特性 描述 是否合入主线 链接
2015/03/25 Alexei Starovoitov ast@plumgrid.com tracing: attach eBPF programs to kprobes NA v11 ☑ 4.1-rc1 PatchWork v11 0/9

3.3.4 Traffic Control Subsystem


eBPF: Traffic Control Subsystem

eBPF 的发展历史和核心设计

linux-next: manual merge of the tip tree with the net-next tree

enum bpf_prog_type enum bpf_attach_type VERSION COMMIT
BPF_PROG_TYPE_SCHED_CLS NA v4.1 ebpf: add sched_cls_type and map it to sk_filter's verifier ops
BPF_PROG_TYPE_SCHED_ACT NA v4.1 ebpf: add sched_act_type and map it to sk_filter's verifier ops
时间 作者 特性 描述 是否合入主线 链接
2015/02/27 Daniel Borkmann daniel@iogearbox.net eBPF support for cls_bpf TODO v1 ☑✓ 4.1-rc1 LORE v1,0/10

3.3.5 tracepoint


3.3.5.1 tracepoint


时间 作者 特性 描述 是否合入主线 链接
2016/04/07 Alexei Starovoitov ast@fb.com allow bpf attach to tracepoints BPF 支持 tracepoint 跟踪 v2 ☑ 4.7-rc1 PatchWork v2 00/10

3.3.5.2 raw tracepoint


raw_tracepoint 相比 tracepoint

  1. 效率更高, 跳过了参数的处理, 不必向 tracepoint 那样根据 format 解析了所有字段, 节约了不必要的开销.

  2. 自由度更大, 提供了对参数的原始访问, 可以直接操作传入 tracepoint 时的指针, 获取某个成员.

  3. 可以获得原始结构体指针. 用于做 key 比较方便, tracepoint 只能拿到里面的各个字段, 有些时候没法做 key.

时间 作者 特性 描述 是否合入主线 链接
2018/02/28 Alexei Starovoitov ast@kernel.org bpf, tracing: introduce bpf raw tracepoints BPF 支持 raw tracepoint 跟踪, 提供了对 tracepoint 参数的访问. v1 ☐☑✓ LORE v1,0/5
-------
LORE v4,00/10
2018/12/13 Matt Mullins mmullins@fb.com bpf: support raw tracepoints in modules NA v2 ☑ 5.0-rc1 PatchWork v2
2019/04/26 Matt Mullins mmullins@fb.com writable contexts for bpf raw tracepoints 引入 BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE, 允许 bpfs 程序修改 tracepoint 中的变量. v5 ☑ 4.17-rc1 PatchWork v5

3.4 Helper Function


enum bpf_func_id VERSION COMMIT
NA NA NA

| 2016/10/27 | Thomas Graf tgraf@suug.ch | bpf: Print function name in addition to function id | TODO | v1 ☐☑✓ 4.10-rc1 | LORE | | 2018/04/25 | Quentin Monnet quentin.monnet@netronome.com | bpf: add documentation for eBPF helpers | 提供 scripts/bpf_helpers_doc.py 脚本根据 include/uapi/linux/bpf.h 生成文档 bpf-helpers.rst. | v1 ☑✓ 4.18-rc1 | LORE | | 2022/05/29 | Lorenzo Bianconi lorenzo@kernel.org | introduce support for XDP programs in CPUMAP | TODO | v ☐☑✓ | LORE v7,0/9 | | 2022/05/29 | Tycho Andersen tycho.andersen@canonical.com | c/r of seccomp filters via underlying eBPF | TODO | v ☐☑✓ | LORE |

3.1.1 dump kernel data


Dumping kernel data structures with BPF

时间 作者 特性 描述 是否合入主线 链接
2018/03/01 Jan H. Schönherr bpf: implement bpf based dumping of kernel data structures BPF 支持 raw tracepoint 跟踪, 提供了对 tracepoint 参数的访问. v1 ☐ PatchWork v2
2020/06/23 Alan Maguire alan.maguire@oracle.com bpf, printk: add BTF-based type printing 在 BPF 程序中通过 printk 打印内核结构体 v3 ☐ PatchWork v3,bpf-next,0/8
2020/08/06 Alan Maguire alan.maguire@oracle.com bpf: add bpf-based bpf_trace_printk()-like support 在 BPF 程序中通过 trace_printk 打印信息 RFC ☐ PatchWork RFC,bpf-next,0/4
2020/09/28 Alan Maguire alan.maguire@oracle.com bpf: add helpers to support BTF-based kernel data display 在 BPF 程序中通过 printk 打印内核结构体 v7 ☐ PatchWork v7,bpf-next,0/8
2021/06/19 Alan Maguire alan.maguire@oracle.com libbpf: BTF dumper support for typed data 引入 btf_dump__dump_type_data, 可以用来输出结构体的信息. v5 ☐ PatchWork v5,bpf-next,0/3

3.1 5 function call


Calling kernel functions from BPF

时间 作者 特性 描述 是否合入主线 链接
2018/03/01 Jan H. Schönherr bpf: Support calling kernel function BPF 支持直接调用内核函数 v2 ☑ 5.13-rc1 PatchWork v2,bpf-next,00/14
2021/08/30 Kumar Kartikeya Dwivedi memxor@gmail.com Support kernel module function calls from eBPF 这组补丁允许 BPF 程序调用内核模块的函数, 并修改验证器逻辑以允许无效的内核函数调用, 只要它们作为死代码消除的一部分被修剪. 这样做是为了为 BPF 对象提供更好的运行时可移植性, 它可以有条件地禁用稍后被验证器修剪的部分代码(例如const volatile vars, kconfig选项). libbpf 的修改与内核的修改一起进行, 以支持模块函数调用.
它还将 TCP 拥塞控制对象转换为使用模块 kfunc 支持, 而不是依赖于 IS_BUILTIN ifdef. v1 ☐ PatchWork bpf-next,RFC,v1,0/8

3.2 printk


时间 作者 特性 描述 是否合入主线 链接
2018/03/01 Jan H. Schönherr bpf: implement variadic printk helper 这组补丁引入了一个新的接口 bpf_trace_vprintk(), 它的功能与 bpf_trace_printk() 类似, 但通过伪 vararg u64 的数组支持 > 3 个参数, 使用与 bpf_trace_printk() 相同的机制写入 /sys/kernel/debug/tracing/trace_pipe, 帮助程序的功能是在 libbpf 问题跟踪程序中请求的. libbpf 的 bpf_printk() 宏被修改为在传递 > 3 个变量时使用 bpf_trace_vprintk(), 否则保留之前的行为, 使用 bpf_trace_printk().
在实现 bpf_seq_printf() 和 bpf_snprintf() 期间添加的 helper函数和宏为 bpf_trace_vprintk() 完成了大部分繁重的工作. 用例很简单: 为 BPF 开发人员提供一个更强大的 printk 将简化 BPF 程序的开发, 特别是在调试和测试期间, 这里往往使用 printk. 这个特性是由 Andrii 在 libbpf 的 issue 中提出的. v2 ☑ 5.13-rc1 PatchWork v5,bpf-next,0/9

3.3 MAP


时间 作者 特性 描述 是否合入主线 链接
2018/08/26 Kumar Kartikeya Dwivedi memxor@gmail.com Implement file local storage 本系列实现了 eBPF LSM 程序的文件本地存储映射. 这允许将映射中数据的生存期与打开的文件描述联系起来. 与其他本地存储映射类型一样, 数据的生存期与结构文件实例相关联. 主要用途是:
1. 用于将与 eBPF 程序中打开的文件(而非 fd)关联的数据绑定在一起, 以便在文件消失时释放数据(例如, 检查点checkpoint/恢复用例restore usecase).
2. 使用eBPF LSM 在用户空间中实现辣椒(Capsicum)风格的功能沙盒, 使用此机制在文件级别强制执行权限.
v2 ☐ PatchWork bpf-next,v2,0/5
2022/04/08 Song Liu song@kernel.org vmalloc: bpf: introduce VM_ALLOW_HUGE_VMAP 630581 v1 ☐☑ LORE v1,0/2

3.5 JIT


时间 作者 特性 描述 是否合入主线 链接
2016/06/22 Naveen N. Rao naveen.n.rao@linux.vnet.ibm.com eBPF JIT for PPC64 cover.1466612260.git.naveen.n.rao@linux.vnet.ibm.com v2 ☐☑✓ LORE v2,0/7
2017/05/26 Shubham Bansal illusionist.neo@gmail.com arm: eBPF JIT compiler 1495754003-21099-1-git-send-email-illusionist.neo@gmail.com v2 ☑✓ 4.14-rc1 LORE
-------
LORE v4
2014/08/26 Zi Shen Lim zlim.lnx@gmail.com arm64: eBPF JIT compiler 1409112930-25677-1-git-send-email-zlim.lnx@gmail.com v2 ☐☑✓ LORE v1,00/14
-------
LORE v2,0/14

3.6 10 BPF allocator


The BPF allocator runs into trouble

Toward signed BPF programs

4 子系统支持


Innovative HID-BPF Expected To Land In Linux 6.2

5 网络场景


6 安全场景


7 内核可编程


时间 作者 特性 描述 是否合入主线 链接
2021/09/09 Kumar Kartikeya Dwivedi memxor@gmail.com bmc-cache 法国电信巨头奥兰治公司(Orange)已经发布了 "BMC", 作为 (e)BPF 内存缓存缓存, 提供了一个专注于 Linux 内核中模棱两两的用法的缓存. Orange 的开源 BPF 内存缓存允许在标准网络堆栈之前处理模组请求, 据说防撞安全, 并且此模块不需要其他内核模块. 此外, 模组用户空间软件本身可以在 BMC 上运行未经修改的软件. 这种内核 eBPF 缓存可将 Memcached 的吞吐量提高 18 倍, 而没有此内核缓存的夹层则提高了 18 倍. 参考 GitHub v2 ☐ github Orange-OpenSource/bmc-cache
2021/09/15 Roman Gushchin guro@fb.com Scheduler BPF NA RFC ☐ PatchWork rfc,0/6
-------
LPC 2021
-------
LKML, LWN

8 用户态工具


8.1 libbpf-tools


[BPF CO-RE clarification] Use CO-RE on older kernel versions.

Help using libbpf with kernel 4.14

How to use libbpf-tools with ubuntu 18.04 4.15 kernel #3232

How to use libbpf-tools with ubuntu 18.04 4.15 kernel

8.2 perf


时间 作者 特性 描述 是否合入主线 链接
2015/10/14 Wang Nan wangnan0@huawei.com perf tools: filtering events using eBPF programs TODO v1 ☐☑✓ LORE v1,0/31

8.3 coolbpf(surtrace & pyLCC)


龙蜥社区开源 coolbpf, BPF 程序开发效率提升百倍 | 龙蜥技术 coolbpf 项目, 以 CO-RE(Compile Once-Run Everywhere)为基础实现, 保留了资源占用低、可移植性强等优点, 还融合了 BCC 动态编译的特性, 适合在生产环境批量部署所开发的应用.

coolbpf 开创了一个新的思路, 利用远程编译的思想, 把用户的BPF程序推送到远端的服务器并返回给用户.o或.so, 提供高级语言如 Python/Rust/Go/C 等进行加载, 然后在全量内核版本安全运行. 用户只需专注自己的功能开发, 不用关心底层库(如 LLVM、python 等)安装、环境搭建, 给广大 BPF 爱好者提供一种新的探索和实践.

coolbpf 本质上是一个 eBPF 开发平台, 通过 pylcc、rlcc、golcc 和 clcc 等实现了高级语言的支持, 同时支持远程编译.

feature 描述
clcc 基于 C 的 LCC
plcc 基于 Python 的 LCC
rlcc 基于 Rust 的 LCC
golcc 基于 Rust 的 LCC
glcc(generic LCC 高版本特性移植到低版本, (g 代表 generic) 是通过将高版本的 BPF 特性移植到低版本, 通过 kernel module 的方式在低版本上运行. 驱动源代码位于 lcc/glcc

glcc 则实现了 eBPF 驱动和 libbpf 的支持, 允许 eBPF 程序无需修改即可在低版本内核上运行.

  1. 通过 eBPF 驱动将 BPF SYSCALL 转换为 IOCTL 系统调用, 为低版本内核提供 eBPF 的能力;

  2. 通过 libbpf 则屏蔽了不同内核版本的差异.

微信公众号-Linux 内核之旅--内核 trace 三板斧 - surtrace-cmd

龙蜥开源内核追踪利器 Surftrace:协议包解析效率提升 10 倍! | 龙蜥技术

iofsstat:帮你轻松定位 IO 突高, 前因后果一目了然 | 龙蜥技术

libbpf 编译平台 LCC——eBPF从入门到享受 | 龙蜥大讲堂第 20 期

eBPF在低版本内核如何跑起来?| 龙蜥大讲堂第46期

8.4 eunomia-bpf


eunomia-bpf: A dynamic loader to run CO-RE eBPF as a service

OpenAnolis/eBPF技术探索 SIG/Eunomia项目介绍

8.5 ubpf


0

1

2

时间 作者 特性 描述 是否合入主线 链接
2022/06/17 Zhang Chen chen.zhang@intel.com Introduce QEMU userspace ebpf support TODO v1 ☐☑✓ LORE v1,0/12

8.6 BCC


An introduction to the BPF Compiler Collection

bcc/ebpf 安装及示例(2019

8.7 continuous profiling


博客 描述
Introduction to Parca - Part 1 Parca 是一个基于 eBPF 在线采样工具.
grafana/phlare

9 WASM(WebAssembly)


WebAssembly 中文网|Wasm 中文文档

9.1 Wasmtime


2019 年, 英特尔、Mozilla 和红帽就启动了字节码联盟, 作为一项旨在促进"无处不在"运行 WebAssembly, 并将 WASM 的范围扩展到 Web 浏览器之外的倡议. 开发三年后(2022 年), WebAssembly 运行时 Wasmtime 1.0 发布了. 参见 phoronix 报道 Wasmtime 1.0 Released - Bytecode Alliance Declares It Production Ready.

Wasmtime 完全开源, 使用 Rust 编程语言, 是的, 并且符合 WASI 标准. Wasmtime还支持与 C/C++, Python, .NET, Go 和其他编程语言的集成, 同时在 Windows / Linux / macOS 平台上运行等等.

10 云原生


Microsoft and Isovalent partner to bring next generation eBPF dataplane for cloud-native applications in Azure

X 学习参考


X.1 业界工具


工具 描述
nyrahul/ebpf-guidee eBPF 常见问题, 样例以及工具汇总
apache/skywalking-rover
GroundCover GroundCover 轻松、大规模地监控 K8s 应用
Exein-io/pulsar Tracing the Linux kernel using Exein Pulsar: a 5 Minute Tutorial

X.2 业界博客


博客 描述
Introduction to Parca - Part 1 Parca 是一个基于 eBPF 在线采样工具.
DWARF-based Stack Walking Using eBPF NA

X.3 eBPF 月报


ebpf 月报 - 2023 年 1 月

X.4 业界论文


论文 描述
Flexible and Low-Overhead System-Call Aggregation using BPF
AnyCall: Fast and Flexible System-Call Aggregation
通过 eBPF 实现的 ANYCALL, 它使用内核内字节码编译器在内核模式下执行安全检查的用户代码. 这允许多个快速的系统调用与错误检查和处理逻辑交织聚合在一起, 只使用一次用户态 / 内核态转换. 并将其扩展为支持系统调用和用户内存访问. 由于内核已经支持灵活的事件处理和调试, 重用 BPF 来实现系统调用聚合, 这表明软件隔离进程对于现代通用操作系统是可行的. 为了证明将真实的用户应用程序移植到 ANYCALL 既实用又直接, 我移植了两个真实的工具, 并记录了所需的代码更改. 最后, 我评估了 ANYCALL 在具有操作系统级缓解措施的系统上的性能, 以对抗活跃或不活跃的瞬时执行漏洞, 包括例如针对 Meltdown 的内核页表隔离 (KPTI). 在 KPTI 不活跃的系统上, 我演示了在计算受限的实际应用程序中高达 10% 的加速. 另一方面, 当 KPTI 处于活动状态时, 我的评估表明, 使用 ANYCALL 可以使系统调用爆发速度提高 98%, 而实际应用程序的速度提高了 32% 到 40%. 参见 [【欧拉多咖
XRP: In-Kernel Storage Functions with eBPF【OSDI22】 XRP 框架允许应用程序从 NVMe 驱动程序中的 eBPF 探针执行用户定义的存储功能, 如索引查找或聚合, 从而安全地绕过内核的大部分存储堆栈. 为了保持文件系统语义, XRP 将少量内核态转移到其 NVMe 驱动程序探针, 并在探针处调用用户注册的 eBPF 函数.