问题标签 [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.
c - 通过 bpf 系统调用加载 eBPF 程序时参数列表太长
我正在尝试通过bpf
Go 中的系统调用加载 eBPF 程序,但我看到系统调用返回错误。为了限制问题,我使用了以下最小的 eBPF 程序,它什么都不做:
Go程序的重要部分如下:
但是,返回的错误是Unable to load program: argument list too long
. 为什么是这样?或者更好的是,如何获得更详细的输出来找出问题的根本原因?
从这里只有三个地方E2BIG
(参数列表太长)从bpf
系统调用返回,但它们似乎都不适合。
如果需要,我可以提供更完整的代码版本,为了简洁起见,我只是试图去掉不相关的部分。
为了帮助重现这个问题,我在下面包含了我的完整 BPF 程序。完整的回购在这里:
c - 尝试加载 BPF 程序时参数无效 (EINVAL)
我正在尝试使用bpf
系统调用加载 BPF 程序,但我invalid argument
在返回时收到 (EINVAL)。从手册页中,可能的原因是:
所以我的 BPF 程序似乎有问题。我的 BPF 程序如下:
这肯定不会有什么问题。
我在Makefile
这里编译(我删除了大部分代码test_overhead_kprobe_kern.c
以提供一个非常简单的测试程序)。
我的程序可能有什么问题导致它被拒绝?
uname -a
: Linux ubuntu1710 4.13.0-32-generic #35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
我的完整用户空间代码(在 Go 中)如下:
c - 加载将缓冲区复制到 BPF 堆栈的 BPF 程序时出错
我正在尝试加载一个简单地将tty_writebuf
的参数复制到 BPF 堆栈的 BPF 程序。我的程序如下:
请注意,我使用tcptracer - bpf中的 bpf_helpers.h 来定义SEC
宏。在我的真实程序中,我实际上会使用buffer
某些东西,但我没有在这里展示那部分。当我尝试加载程序(从使用gobpf的 ELF 文件)时,我收到以下错误:
为什么是这样?我的程序是从ttysnoop.py改编的,所以我知道可以做我想做的事情。我的程序的完整反汇编如下:
uname -a
: Linux ubuntu1710 4.13.0-32-generic #35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
编辑:
作为一个实验,我尝试加载一个类似于作为辅助函数引入时描述的示例程序的程序:bpf_probe_read_str
加载没有问题并提供以下组件:
因此,似乎我的程序在触发 kprobe 后将tty_write
第三个寄存器直接传递给 from 的调用;bpf_probe_read
这可能是我看到的错误的原因,但我不确定。
c - 在 BPF 程序中从指向大型结构的指针中检索字段时权限被拒绝
我正在尝试编写一个 BPF 程序来检查调用tty_write
内核函数的任何进程的会话 ID。为了检索 ID,我需要从指向 current 的指针中跟踪多个字段task_struct
,但是从指向当前任务的指针中检索group_leader
指针似乎是错误的,因为与当前任务指针的偏移量太大。我的 BPF 程序代码如下:
这失败并出现以下错误。注意我是使用gobpf的elf包来加载编译好的程序:
我该如何解决这个问题,原因是什么?我认为这可能是由于堆栈大小的 512 字节限制,但我不是为什么在这种情况下这很重要。
uname -a
: Linux ubuntu1710 4.13.0-32-generic #35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
bpf - 在 BPF 程序中总是得到 0 会话 ID
我正在尝试编写一个 BPF 程序来检查调用tty_write
内核函数的任何进程的会话 ID。我试图通过从当前task_struct
结构中检索一个字段来做到这一点。我的代码如下:
请注意,我正在将我的 BPF 程序编译clang
成一个 ELF 文件并使用gobpf 的ELF 包加载它。不幸的是, 的值sessionid
始终为 0。这是为什么呢?我认为我没有错误地访问会话 ID,因为我在 4.11 内核上使用bcc之前已经这样做了(由于 bcc 如何重写 BPF 程序,当我想自己编译程序时,我不能简单地使用相同的代码)。用于访问的等效工作密件抄送代码sessionid
如下。请注意,这仅适用于 4.11 内核,以下代码不适用于 4.13 内核。然而,上面的代码在这两个内核上都不起作用。
4.11内核:
uname -a
:Linux ubuntu16 4.11.0-14-generic #20~16.04.1-Ubuntu SMP Wed Aug 9 09:06:22 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
4.13内核:
uname -a
: Linux ubuntu1710 4.13.0-32-generic #35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
filesystems - eBPF:检索固定 bpf 程序的“fd”
我知道该eBPF
程序可以固定到/sys/fs/bpf
(默认位置 small bpffs
。例如使用bpftool
:
我期待这会返回内核open("/sys/fs/bpf/my_bpf")
分配给我的文件描述符的值。my_bpf
但是open()
调用失败了,我认为它会返回-EINVAL
。
在这种情况下,钉住的目的是什么?fd
鉴于当前可能加载了很多 BPF 程序,我通常如何获得BPF 程序。我知道这libbpf
允许fd
从中检索id
,但如果我没有id
呢?
bpf - eBPF:在 Linux 命名空间中运行
所以BPF
程序是内核实体,因为它们在内核空间中运行。另一方面,Linux 命名空间又名容器,提供应用程序级别的隔离,在这种情况下,它们都共享主机的内核、内核模块等。
所以我想每个容器加载一个程序是没有意义的bpf
,因为它也会在主机上变得可见?
因此,我猜想bpf
程序会加载到主机和监视器/mangle/等上。进出命名空间的数据包。鉴于struct sock
有关于命名空间 id 的信息,我认为只有某些类型的bpf
程序才能做到这一点?
c - 如何在 BPF 程序中检索当前任务的会话 ID?
BPF 辅助函数bpf_get_current_task
返回一个指向当前任务的task_struct
. 如何在 BPF 程序中使用它来检索当前任务的会话 ID?
c - eBPF:理解验证器代码中的两个宏
我正在查看ebpf
验证程序代码,但无法理解以下宏:
我理解offsetof
和offsetofend
宏,但是什么...
意思?
谢谢。