问题标签 [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.
c - 一个元素的 eBPF 映射。映射类型和内核/用户空间通信
我会创建一个映射来仅存储一个元素(端口号),并且应该从用户空间和内核空间读取/写入它。我应该使用哪种地图类型?哪个大小的键和值是合适的,我如何从双方写入/读取?
_user.c
_kern.c
如何引用 map_fd 并在同一张地图上操作?
编辑:
我只能通过一种方式成功地创建地图并与之交互:在_kern.c
文件中定义地图,如下所示:
该定义允许使用 bpf 助手直接在地图上进行操作,例如bpf_map_lookup_elem
.
而是在通过我使用将ebpf 程序_user.c
加载到内核之后_kern.o
bpf_prog_load
map_fd = bpf_object__find_map_fd_by_name(obj, "my_map");
检索与地图关联的文件描述符(我错过了这一点)。例如,一旦您获得要执行的文件描述符,您就可以调用地图更新
问题:在这种情况下,我使用 libbpf 从用户空间检索 fd,但是如果我从中创建映射_user.c
,bpf_create_map
那么如何从 ebpf 程序中检索 fd?
c - 每种类型的 ebpf 程序的上下文
我已经看到,对于每种类型的 ebpf 程序,程序都有不同的输入(上下文)。例如,在 BPF_PROG_TYPE_SOCKET_FILTER 程序的情况下,指向 struct __sk_buff 的指针作为参数传递。每个程序类型的上下文在哪里定义?
c - tracepoint/syscalls/sys_enter 不会触发 bpf_trace_printk
目标:每次执行系统调用时打印 Hello。
代码:
_kern.c
_user.c
问题:当我运行程序时,如果调用 open 系统调用,它也会终止而不打印“Hello”。
问题:我错过了什么?我也尝试过 sys_enter_open 而不是 sys_enter
linux-kernel - ebpf 加载器之间的主要区别
如果我理解得很好,有不同的 ebpf 加载器:
- bpf_load.c 进入内核源代码
- libbpf
- bpftool
- tc
- ... <-- 其他人?
它们之间的主要区别是什么?它们总是可以互换吗?我应该总是更喜欢 libbpf 吗?
c - ebpf 的受限 C 中不允许什么?
从 bpf 手册页:
eBPF 程序可以用受限的 C 语言编写,该 C 语言被编译(使用 clang 编译器)成 eBPF 字节码。这个受限制的 C 语言省略了各种特性,例如循环、全局变量、可变参数函数、浮点数以及作为函数参数传递的结构。
AFAIK 手册页未更新。我想知道在使用受限 C 编写 eBPF 程序时究竟禁止什么?手册页所说的仍然正确吗?
c - 为什么 bpf 代码无法访问 cpumap_enqueue_ctx 的前 8 个字节?
阅读一些附加到跟踪点的 ebpf 示例,我注意到每个结构都是从这样的填充开始构建的(来自samples/bpf/xdp_redirect_cpu_kern.c
)
我发现的只是这条评论,它说 bpf 代码无法访问前 8 个字节,但我不明白为什么。
c - 如何在 ebpf 中使用 seccomp 过滤器?
我正在寻找 eBPF 的示例来编写 seccomp 过滤器,但我找不到。有人可以告诉我是否可以使用 eBPF 编写 seccomp 过滤器?
c - 无法正确访问跟踪点上下文结构字段
目标:仅当使用 O_RDONLY 标志调用 openat 时才写入 trace_pipe。我已经构建了结构,查看此处包含的格式 /sys/kernel/debug/tracing/events/syscalls/sys_enter_open/format
问题我认为我没有访问 flags 字段,因为看起来第二个 if 语句总是错误的。 问题:我是否正确访问了标志字段?有没有办法打印标志变量内容?
macos - macOS 上 Rust 程序的类 DTrace 函数追踪
我有一个使用 C FFI 的 Rust 程序,我想在任何时候调用该 C FFI 中的函数并将参数传递给它。
我在 macOS 上开发,看起来 DTrace 很合适,但是在启用 macOS SIP 的情况下,DTrace 不能很好地工作。我不想禁用 SIP。
我正在考虑使用这个 DTrace 提供程序:
pid$target:::entry
问题:
有没有更好的方法在 macOS/Rust 上执行此操作?
为了在我的 Rust 程序上使用 DTrace/eBPF,作为 VM 运行的最佳操作系统是什么?
c - 为什么在 bpf_helpers 中定义了 load_half,但它没有出现在 filter.c 中?
tools/testing/selftests/bpf/bpf_helpers.h
如果我在bpf 中理解“很好”,则定义了帮助原型。
如果我想现在哪些助手可用于特定程序类型,我需要在结果中搜索'func_proto(enum bpf_func_id func_id' kernel/ net/ drivers/
例如,要检查套接字过滤器程序可以调用的助手,我可以阅读以下定义
问题:
1)我看不到load_half
,但我仍然可以从我的套接字过滤程序中调用它。为什么?socket_filter
2)和有什么区别sk_filter
?