我正在尝试使用libbpf编写eBPF,但是文档非常少,我甚至在理解一些与eBPF程序执行相关的基本内容时都遇到了困难。我最感兴趣的是BPF_PROG_TYPE_PERF_EVENT
程序类型,以防答案取决于程序类型,但我也希望参考在哪里可以找到其他程序类型的相应信息。
- eBPF程序是如何相对于触发事件的任务/线程(AFAIU,在eBPF上下文中是相同的)执行的,eBPF程序被附加到该事件?eBPF是在运行触发任务/线程的同一CPU上执行(任务/线程暂停,直到程序完成),还是可以并行运行?
1.在哪里可以确切地找到传递给eBPF程序的参数(上下文)是什么?我知道这与程序类型有关,对于BPF_PROG_TYPE_SOCKET_FILTER
,这甚至在bpf(2)手册页中有说明,但是其他程序类型呢? - eBPF程序的返回值是否会对某些方面产生影响?我想,C编程语言中的每个eBPF程序都必须返回一个64位整数,因为负责存储返回值的eBPF寄存器必须在程序退出时被填充,但是返回值对Linux来说真的有意义吗?同样,如果这与程序类型有关,我可以在哪里找到有关此问题的信息?
我真的很感激不仅答案,但也参考了一些官方来源的答案,这些和类似的问题可以找到。
1条答案
按热度按时间b4wnujal1#
eBPF程序是如何相对于任务/线程执行的
它取决于程序类型,某些程序类型是作为线程的直接结果而触发的。syscalls或LSM挂钩上的探测器由任务触发,因此TID甚至任务结构是已知的。但是像
BPF_PROG_TYPE_SCHED_CLS
这样的程序类型是在内核线程的上下文中的网络堆栈中执行的,所以没有用户空间线程相关联。(AFAIU,这些在eBPF上下文中相同)触发了eBPF程序所附的事件?
通常,eBPF程序的上下文是指经由其“自变量”给予BPF程序的数据。但是知道程序何时被内核调用也是要考虑的一个重要方面。
eBPF是否在运行触发任务/线程的同一CPU上执行
是的。BPF程序总是在运行触发代码的同一个逻辑CPU上运行。BPF程序保证永远不会从该CPU迁移。
(and任务/线程会暂停,直到程序完成),或者它们可以并行运行?
BPF程序按顺序运行到触发代码。您可以将它们视为可能需要一些时间才能返回执行的函数。
在哪里可以确切地找到传递给eBPF程序的参数(上下文)是什么?我知道这与程序类型有关,对于BPF_PROG_TYPE_SOCKET_FILTER,这甚至在bpf(2)手册页中有说明,但是其他程序类型呢?
有一些文档在那里,如https://docs.kernel.org/bpf/index.html或https://ebpf-docs.dylanreimerink.nl/linux/program-type/,但最愚蠢的证明方法是阅读内核源代码。对于大多数程序类型,https://github.com/torvalds/linux/tree/master/tools/testing/selftests/bpf/prog_tests或https://github.com/torvalds/linux/tree/master/samples/bpf中都有示例
如果失败,您可以在源代码中搜索您的程序类型的
const struct bpf_verifier_ops
声明,然后使用.is_valid_access
函数,该函数通常会转义到上下文类型。例如,对于perf事件:eBPF程序的返回值是否会对某些方面产生影响?我想,C编程语言中的每个eBPF程序都必须返回一个64位整数,因为负责存储返回值的eBPF寄存器必须在程序退出时被填充,但是返回值对Linux来说真的有意义吗?同样,如果这与程序类型有关,我可以在哪里找到有关信息?
是的,对于大多数程序类型,返回值都有意义。对于每个程序类型,其含义是不同的,有时被解释为枚举值,有时被解释为错误代码,有时被解释为数据包长度等数字。某些程序类型只允许返回“有效”返回值,而对于其他程序类型则无所谓。
每个程序类型的返回类型的含义通常也与上下文类型记录在同一页上,但要找到相关的内核代码,必须查看它在
bpf_prog_run
调用站点的使用方式。