48 KiB
title, date, author, tags, categories, thumbnail, blogexcerpt
| title | date | author | tags | categories | thumbnail | blogexcerpt | |||
|---|---|---|---|---|---|---|---|---|---|
| BPF 子系统 | 2021-02-15 00:32 | gatieme |
|
|
虚拟化 & 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 概述
BPF的可移植性和CO-RE (Compile Once – Run Everywhere)
Libbpf-tools —— 让 Tracing 工具身轻如燕
狄卫华--eBPF 技术全面介绍 -- 历史、现在、未来(阅码场--直播回放), 直播视频解读 一文读懂 eBPF 的前世今生
2 工作流程
2.1 编译器
自 2019 年 5 月以来, Oracle 一直计划在 GCC 10 中引入 eBPF 后端, 以使 GNU 编译器成为通用内核虚拟机. Oracle 为 GCC 引入 eBPF 支持的倾向是该公司在 Linux 上改进 DTrace 的努力的一部分. 作为编译目标, eBPF 因内核验证器施加的限制而不同, 并且由于架构的安全驱动设计. 目前, 只要违反 eBPF 限制, 后端就会发出错误. 这增加了内核验证器可以接受结果对象的机会, 从而缩短了开发周期. 参见 .
GCC 的支持 eBPF 经过了 3 个阶段.
-
首先在 toolchain 里添加 BPF 的最基本的支持, 将 BPF target 添加到 GNU toolchain, 包括 binutils 支持 BPF, 以及让 GCC 能支持一个新的 bpf-unknown-none 的 target.
-
确保生成的程序能够被内核里的 BPF verifier 验证通过, 从而允许加载到内核中.
-
最后一个阶段是为 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 | LWN:GCC 也支持 BPF 了! |
| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 |
|---|---|---|---|---|---|
| 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.
| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 |
|---|---|---|---|---|---|
| 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
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
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
-
效率更高, 跳过了参数的处理, 不必向 tracepoint 那样根据 format 解析了所有字段, 节约了不必要的开销.
-
自由度更大, 提供了对参数的原始访问, 可以直接操作传入 tracepoint 时的指针, 获取某个成员.
-
可以获得原始结构体指针. 用于做 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
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 程序无需修改即可在低版本内核上运行.
-
通过 eBPF 驱动将 BPF SYSCALL 转换为 IOCTL 系统调用, 为低版本内核提供 eBPF 的能力;
-
通过 libbpf 则屏蔽了不同内核版本的差异.
微信公众号-Linux 内核之旅--内核 trace 三板斧 - surtrace-cmd
龙蜥开源内核追踪利器 Surftrace:协议包解析效率提升 10 倍! | 龙蜥技术
iofsstat:帮你轻松定位 IO 突高, 前因后果一目了然 | 龙蜥技术
libbpf 编译平台 LCC——eBPF从入门到享受 | 龙蜥大讲堂第 20 期
8.4 eunomia-bpf
eunomia-bpf: A dynamic loader to run CO-RE eBPF as a service
OpenAnolis/eBPF技术探索 SIG/Eunomia项目介绍
8.5 ubpf
| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 |
|---|---|---|---|---|---|
| 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
8.7 continuous profiling
| 博客 | 描述 |
|---|---|
| Introduction to Parca - Part 1 | Parca 是一个基于 eBPF 在线采样工具. |
| grafana/phlare |
9 WASM(WebAssembly)
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 云原生
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 月报
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【OSDI’22】 | XRP 框架允许应用程序从 NVMe 驱动程序中的 eBPF 探针执行用户定义的存储功能, 如索引查找或聚合, 从而安全地绕过内核的大部分存储堆栈. 为了保持文件系统语义, XRP 将少量内核态转移到其 NVMe 驱动程序探针, 并在探针处调用用户注册的 eBPF 函数. |
-
本作品/博文 ( AderStep-紫夜阑珊-青伶巷草 Copyright ©2013-2017 ), 由 成坚(gatieme) 创作.
-
采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 欢迎转载、使用、重新发布, 但务必保留文章署名成坚gatieme ( 包含链接: http://blog.csdn.net/gatieme ), 不得用于商业目的. -
基于本文修改后的作品务必以相同的许可发布. 如有任何疑问, 请与我联系.
-
转载请务必注明出处, 谢谢, 不胜感激