问题标签 [bpf]

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.

0 投票
1 回答
1290 浏览

linux-kernel - BPF:地图的所有者

这是谁在 BPF 中创建地图的后续行动,因为我的新问题与该线程没有直接关系。

所以,在我看来,必须有一个创建 BPF 映射的,要么是 bpf 程序,要么是加载 bpf 的用户程序等。

BPF 程序必须在编译时知道它将使用的映射类型,所以我们需要:

所以这意味着一个用户程序,例如bpftool,将启动在 bpf ELF 部分中找到的映射的创建,如谁在 BPF线程中创建映射所示。

另一方面,用户应用程序将需要在地图中添加/删除条目。为此,它必须知道 mapID才能使用bpf_map_get_fd_by_id()from获取 get map 的 fd libbpf。之后我们就可以享受bpf_map_update_elem()和类似的API了。

另一方面,如果我们在 BPF 程序中声明了一个 map 部分并且确实使用了 map API,则 map(s) 将保留在内核中并分配 ID。

所以在这种情况下,我们将有两个具有两个不同 ID 的映射:一个作为bpf_prog_load()from的结果创建bpftool,另一个来自用户应用程序bpf_create_map()(假设应用程序继续运行,例如更新映射,并且不返回到 shell )。

一定有办法绕过这种歧义吗?

0 投票
0 回答
1567 浏览

c - eBPF:尾调用

我正在玩 的tail calls功能BPF,似乎没有加载简单的代码:

所以我编译它llv-3.8并加载bpftool

所以man 2 bpf提到:

我看不出这个小小的简单程序有什么问题,也llvm-objdump失败了:

更新 1

按照 Qeole 的建议,我升级到clang-5.0,重建了我的程序,现在它的抱怨有所不同:

现在我可以调查 ELF 部分:

以下是可用的部分:

看起来bpftool找不到部分.eh_frame

更新 2

我继续试验 :-) 首先我更新libbpf了最新的提交d77be68955475fc2321e73fe006240248f2f8fef修复字符串比较,然后我用 重建程序-fno-asynchronous-unwind-tables,这不包括.eh_frame部分,而且我给出了唯一的部分名称,例如 sockops0、sockops1 等。现在bpftool prog load ..成功但bpftool prog show只转储一个程序,最先运行的程序,在我的例子中是 bpf1()。

目前我可以说 bpf_object__load_progs() 将 obj->nr_programs 报告为 4,这对我的示例来说是有意义的。

0 投票
1 回答
943 浏览

c - ebpf - 部分名称

程序中的每个程序部分都必须有唯一的名称bpf吗?例如,这个程序编译得很好llvm-5.0

但是,llvm-objdump只报告一个程序部分:

是否有编译器选项至少给出警告?

更新- 所以我知道在同一个 bpf 文件中提供的部分必须具有唯一的名称。如果 bpf 程序驻留在不同的文件中并独立编译,这样它们就可以被加载并相互调用,例如,这是真的tail calls吗?

0 投票
1 回答
1420 浏览

c - 如何从内核空间确定 PID 位于哪些命名空间?

我正在尝试编写一个 eBPF 程序来记录系统上运行的容器对特定系统调用的每次调用。我正在使用密件抄送,可以使用bpf_get_current_pid_tgid().

从用户空间我可以检查 proc 文件系统以确定进程的名称空间是否与根名称空间不同,以猜测它是否是容器进程,但我不知道你如何从内核空间做到这一点?

0 投票
1 回答
296 浏览

linux - 如何在 eBPF 程序中检索任务的 sessionid?

我想从 eBPF 程序中的任务结构中检索 sessionid。我的 eBPF 程序中有以下代码:

这会运行,但 sessionid 总是以 -1 结束。我读到这个答案,我可以用task_session它来检索它,但我收到一个关于无效内存访问的错误。我相信我需要使用bpf_probe_read将指向的指针移到堆栈上,但我无法让它工作。有什么我想念的吗?task_structtask

0 投票
0 回答
529 浏览

garbage-collection - 如何使用 trace(eBPF 工具包之一)来探测 OpenJDK HotSpot 代码?

traceeBPF bcc 工具包之一。

在这个例子中

因为trace可以探测用户级和内核级的函数活动(如下图),但是教程非常有限!!!

在此处输入图像描述

任何人都可以提供黑客用户级程序代码的分步教程,就像这篇文章中的问题一样?

目标:我想探测功能minor_collection_begin

0 投票
1 回答
252 浏览

compiler-errors - 在 alpine 中构建 bcc,“未命名类型”错误

我正在尝试构建 bcc bccAlpine。

这是我编写的要编译的 Dockerfile bcc

不幸的是,在运行时make我偶然发现了以下错误:

我该如何解决这个问题?

0 投票
1 回答
1573 浏览

c - 如何通过 kprobe 将 BPF 程序附加到内核函数?

Cilium BPF 和 XDP 参考指南描述了如何通过ipandtc命令将 BPF 程序加载到网络设备。如何以相同的方式将 BPF 程序附加到内核函数/用户空间函数?

0 投票
1 回答
629 浏览

c - eBPF:默认的 bpf 程序/地图?

我正面临着bpf最新net-next内核的奇怪行为。在启用所有 BPF 内核选项(包括CONFIG_BPF_JIT_ALWAYS_ON)且未加载任何 bpf程序的情况下,bpftool报告以下内容:

这是程序包含的内容:

有趣的是我没有eBPF明确加载任何程序。我想知道内核中现在是否有一个默认的eBPFblob 显示出来?

这发生在机器启动后。这个系统和另一个系统之间的唯一区别(运行相同的内核和选项,我没有看到多个 cgroup_skb 程序的这个问题)是/sys/fs/cgroup/unifiedcgroup2 FS 的存在。我不知道这是否与我的问题有关,但我不知道如何禁用/sys/fs/cgroup/unified,不允许卸载。

0 投票
2 回答
2026 浏览

networking - eBPF:全局变量和结构

所以我有一个简单的eBPF代码:

我的.h:

my_kern.c:

我用 构建代码llvm-5.0,没有错误/警告,但是bpftool prog load ...失败了:

第 6 节包含我的my_foo结构,我可以用llvm-objdump.

my_foo例如,如果我定义内部main()函数,则不会发生此错误。这是否意味着 eBPF 约定不允许这样的全局声明?