问题标签 [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.
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 )。
一定有办法绕过这种歧义吗?
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,这对我的示例来说是有意义的。
c - ebpf - 部分名称
程序中的每个程序部分都必须有唯一的名称bpf
吗?例如,这个程序编译得很好llvm-5.0
:
但是,llvm-objdump
只报告一个程序部分:
是否有编译器选项至少给出警告?
更新- 所以我知道在同一个 bpf 文件中提供的部分必须具有唯一的名称。如果 bpf 程序驻留在不同的文件中并独立编译,这样它们就可以被加载并相互调用,例如,这是真的tail calls
吗?
c - 如何从内核空间确定 PID 位于哪些命名空间?
我正在尝试编写一个 eBPF 程序来记录系统上运行的容器对特定系统调用的每次调用。我正在使用密件抄送,可以使用bpf_get_current_pid_tgid()
.
从用户空间我可以检查 proc 文件系统以确定进程的名称空间是否与根名称空间不同,以猜测它是否是容器进程,但我不知道你如何从内核空间做到这一点?
linux - 如何在 eBPF 程序中检索任务的 sessionid?
我想从 eBPF 程序中的任务结构中检索 sessionid。我的 eBPF 程序中有以下代码:
这会运行,但 sessionid 总是以 -1 结束。我读到这个答案,我可以用task_session
它来检索它,但我收到一个关于无效内存访问的错误。我相信我需要使用bpf_probe_read
将指向的指针移到堆栈上,但我无法让它工作。有什么我想念的吗?task_struct
task
garbage-collection - 如何使用 trace(eBPF 工具包之一)来探测 OpenJDK HotSpot 代码?
在这个例子中
因为trace
可以探测用户级和内核级的函数活动(如下图),但是教程非常有限!!!
任何人都可以提供黑客用户级程序代码的分步教程,就像这篇文章中的问题一样?
目标:我想探测功能minor_collection_begin
c - 如何通过 kprobe 将 BPF 程序附加到内核函数?
Cilium BPF 和 XDP 参考指南描述了如何通过ip
andtc
命令将 BPF 程序加载到网络设备。如何以相同的方式将 BPF 程序附加到内核函数/用户空间函数?
c - eBPF:默认的 bpf 程序/地图?
我正面临着bpf
最新net-next
内核的奇怪行为。在启用所有 BPF 内核选项(包括CONFIG_BPF_JIT_ALWAYS_ON
)且未加载任何 bpf
程序的情况下,bpftool
报告以下内容:
这是程序包含的内容:
有趣的是我没有eBPF
明确加载任何程序。我想知道内核中现在是否有一个默认的eBPF
blob 显示出来?
这发生在机器启动后。这个系统和另一个系统之间的唯一区别(运行相同的内核和选项,我没有看到多个 cgroup_skb 程序的这个问题)是/sys/fs/cgroup/unified
cgroup2 FS 的存在。我不知道这是否与我的问题有关,但我不知道如何禁用/sys/fs/cgroup/unified
,不允许卸载。
networking - eBPF:全局变量和结构
所以我有一个简单的eBPF
代码:
我的.h:
my_kern.c:
我用 构建代码llvm-5.0
,没有错误/警告,但是bpftool prog load ...
失败了:
第 6 节包含我的my_foo
结构,我可以用llvm-objdump
.
my_foo
例如,如果我定义内部main()
函数,则不会发生此错误。这是否意味着 eBPF 约定不允许这样的全局声明?