问题标签 [ebpf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 如何构建 Linux 内核以支持 SO_ATTACH_BPF 套接字选项?
我想构建一个支持eBPF
(CentOS 7
内核版本为3.10.0
)的应用程序:
于是我下载了一个4.0.5
版本,在上面进行如下配置:
然后按照此链接构建和安装4.0.5
内核。
执行后make modules_install install
发现还是没有SO_ATTACH_BPF
in <asm-generic/socket.h>
,所以上面的代码无法编译成功。
如何构建 Linux 内核以支持SO_ATTACH_BPF
套接字选项?
linux - eBPF 可以修改系统调用的返回值或参数吗?
为了模拟某些行为,我想将一个探针附加到系统调用并在传递某些参数时修改返回值。或者,在函数成为进程之前修改函数的参数也足够了。
BPF有可能吗?
linux-kernel - 如何使用 BPF 访问内核变量?
例如,要访问skb
函数中的变量ip_rcv
:
我搜索了互联网,但找不到任何示例。
trace - 是否可以使用 eBPF 或 perf 来计算在单个跟踪函数中花费的时间?
目前,我可以告诉trace-cmd
(一个 ftrace 前端)使用 ftrace 的函数图基础结构来跟踪指定的工作负载。使用一些跟踪数据处理工具,我可以查看调用函数的频率以及每个函数调用的相应总持续时间。示例输出可能如下所示,其中我跟踪工作负载生成的 ext4 函数调用:
我已经看到可以通过、、等生成的令人难以置信的火焰图,这让我相信我应该能够实现与使用or的输出相似的输出。但是,有一些障碍:eBPF
systemtap
perf
trace-cmd
perf
eBPF
- 我的工作负载最多可以运行 15 分钟,如果我使用
perf
. 作为参考,您可以查看在更短的时间内跟踪 bash 的示例输出。 - 我不够熟悉,
eBPF
无法确定我是否可以实现与我trace-cmd
的后处理示例输出类似的数据/输出。
对于那些比我更熟悉eBPF
或perf
比我更熟悉的人,我想知道:
- 是否可以使用
eBPF
或perf
实现我的目标? - 如果是这样,为什么可能?
如果您感觉特别慷慨,将不胜感激可以帮助我实现目标的示例代码/命令。
linux-kernel - 无法附加 eBPF blob
我刚刚从内核编译了 BPF 示例tools/testing/selftests/bpf
并尝试按照http://cilium.readthedocs.io/en/v0.10/bpf/中的说明进行加载:
这发生在内核 4.4.0-98 的 Ubuntu 16.04.3 LTS 上,llvm
并且clang
从包安装的版本 3.8iproute2
是来自 github 的最新版本。
我怀疑我遇到了一些工具链/内核版本/功能不匹配的问题。
我究竟做错了什么?
linux-kernel - 简单的 eBPF 操作不与 tc 一起生效
samples/bpf/pare_simple.c
我从(来自 Linux 内核树)编译了 BPF 示例,并进行了非常简单的更改:
所以我希望丢弃任何数据包。我安装它如下:
这发生在 Ubuntu 16.04.3 LTS 上,内核为 4.4.0-98,llvm 和从软件包安装的 3.8 版本的 clang,iproute2 是来自 github 的最新版本。
所以它似乎安装成功,但是这个过滤器/ebpf 不会丢弃数据包,我在eth0
接口上生成入口流量,例如 ICMP,它会继续。我究竟做错了什么?
linux-kernel - bpf_printk() 的输出
在运行一些示例时,samples/bpf
我注意到bpf_printk
输出前面带有一些额外的信息,例如:
BPF command: 2
是传递给bpf_printk
bpf 程序的实际字符串,但其余的是什么?我假设这来自内核的 JIT ?
我在哪里可以更仔细地查看这些位的含义?谢谢。
linux-kernel - 无法使用密件抄送工具将 eBPF `kretprobes` 附加到 `napi_poll()`
想法是用来argdist
测量延迟时间,napi_poll()
其中返回处理的数据包数量(称为工作)。执行延迟与napi_poll()
处理的数据包数量的比率将为我提供以直方图形式处理每个数据包所需的平均时间。
我正在使用以下命令
argdist -H 'r:c:napi_poll():u64:$latency/$retval#avg time per packet (ns)'
这最终给了我错误Failed to attach BPF to kprobe
,在 dmesg 我收到类似的消息Could not insert probe at napi_poll+0: -2
我只是好奇为什么当类似的技巧适用时kretprobes
我不能附加?napi_poll()
net_rx_action()
linux-kernel - 谁在 BPF 中创建地图
在阅读man bpf
和其他一些文档来源之后,我的印象是 amap
只能由用户进程创建。然而,下面的小程序似乎神奇地创建了bpf
地图:
所以我用内核加载程序,tools/bpf/bpftool
并验证程序是否已加载:
当然地图是空的。但是,bpf_map_lookup_elem
从程序中删除会导致不创建地图。
更新
我用它调试它,strace
发现在这两种情况下,即有bpf_map_lookup_elem
和没有它,bpftool 确实调用bpf(BPF_MAP_CREATE, ...)
并且它显然成功了。然后,如果 bpf_map_lookup_elem 被遗漏,我 strace onbpftool map show
并bpf(BPF_MAP_GET_NEXT_ID, ..)
立即返回ENOENT
,它永远不会转储地图。所以很明显有些东西没有完成地图的创建。
所以我想知道这是否是预期的行为?
谢谢。
c - ebpf - 部分名称
程序中的每个程序部分都必须有唯一的名称bpf
吗?例如,这个程序编译得很好llvm-5.0
:
但是,llvm-objdump
只报告一个程序部分:
是否有编译器选项至少给出警告?
更新- 所以我知道在同一个 bpf 文件中提供的部分必须具有唯一的名称。如果 bpf 程序驻留在不同的文件中并独立编译,这样它们就可以被加载并相互调用,例如,这是真的tail calls
吗?