什么是 eBPF
2024-10-09 19:54:52 1 举报
AI智能生成
eBPF 介绍
作者其他创作
大纲/内容
原文
什么是 ebpf
overview
由来
BPF 最初代表伯克利包过滤器 (Berkeley Packet Filter),但是现在 eBPF(extended BPF) 可以做的不仅仅是包过滤
官方标志
蜜蜂 eBee
ebpf 简介
钩子预览
eBPF 程序是事件驱动的,当内核或应用程序通过某个钩子点时运行
预定义钩子
系统调用(system calls)
函数入口/出口(function entry/exit)
内核跟踪点(tracepoints)
网络事件(network events)
动态探针
内核探针(kprobe)
用户探针(uprobe)
hook-overview
如何编写 ebpf 程序
eBPF 不是直接使用,而是通过像 Cilium、bcc 或 bpftrace 这样的项目间接使用
原因
Linux 内核期望 eBPF 程序以字节码的形式加载
利用像 LLVM 这样的编译器套件将伪 c 代码编译成 eBPF 字节码
clang - target bpf
加载器和校验架构
确定所需的钩子后,可以使用 bpf 系统调用将 eBPF 程序加载到 Linux 内核中
当程序被加载到 Linux 内核中时,它在被附加到所请求的钩子上之前需要经过两个步骤
验证(verification)
加载 eBPF 程序的进程必须有所需的能力(特权)
eBPF 程序不会崩溃或者对系统造成损害
eBPF 程序一定会运行至结束(即程序不会处于循环状态中,否则会阻塞进一步的处理)
JIT 编译(Just-in-Time (JIT) compilation)
将程序的通用字节码转换为机器特定的指令集
Maps
共享和存储所收集的信息和状态
支持的 map 类型
哈希表,数组
LRU (Least Recently Used) 算法
环形缓冲区
堆栈跟踪 LPM (Longest Prefix match)算法
...
Helper 调用(Helper Calls)
eBPF 程序不直接调用内核函数。eBPF 程序改为调用 helper 函数达到效果,这是内核提供的通用且稳定的 API
eBPF 程序不能直接访问任意内核内存。必须通过 eBPF helper 函数来访问程序上下文之外的数据和数据结构
helper 调用集
生成随机数
获取当前时间日期
eBPF map 访问
获取进程 / cgroup 上下文
操作网络数据包及其转发逻辑
...
开发工具链
bcc
BCC 是一个框架,它允许用户编写 python 程序,并将 eBPF 程序嵌入其中
运行 python 程序将生成 eBPF 字节码并将其加载到内核中
bcc
bpftrace
bpftrace 是一种用于 Linux eBPF 的高级跟踪语言,可在较新的 Linux 内核(4.x)中使用
bpftrace 使用 LLVM 作为后端,将脚本编译为 eBPF 字节码,并利用 BCC 与 Linux eBPF 子系统以及现有的 Linux 跟踪功能(内核动态跟踪(kprobes)、用户级动态跟踪(uprobes)和跟踪点)进行交互
bpftrace
eBPF Go 语言库
eBPF Go 语言库提供了一个通用的 eBPF 库,它将获取 eBPF 字节码的过程与 eBPF 程序的加载和管理进行了解耦
eBPF 程序通常是通过编写高级语言,然后使用 clang/LLVM 编译器编译成 eBPF 字节码来创建的
gobpf
libbpf C/C++ 库
libbpf 库是一个基于 C/ c++ 的通用 eBPF 库,它可以帮助解耦将 clang/LLVM 编译器生成的 eBPF 对象文件的加载到内核中的这个过程,并通过为应用程序提供易于使用的库 API 来抽象与 BPF 系统调用的交互
libbpf
0 条评论
下一页