问题标签 [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.
bpf - eBPF:在 Linux 命名空间中运行
所以BPF
程序是内核实体,因为它们在内核空间中运行。另一方面,Linux 命名空间又名容器,提供应用程序级别的隔离,在这种情况下,它们都共享主机的内核、内核模块等。
所以我想每个容器加载一个程序是没有意义的bpf
,因为它也会在主机上变得可见?
因此,我猜想bpf
程序会加载到主机和监视器/mangle/等上。进出命名空间的数据包。鉴于struct sock
有关于命名空间 id 的信息,我认为只有某些类型的bpf
程序才能做到这一点?
c - eBPF:理解验证器代码中的两个宏
我正在查看ebpf
验证程序代码,但无法理解以下宏:
我理解offsetof
和offsetofend
宏,但是什么...
意思?
谢谢。
linux - BPF: translation of program contexts
I was looking at the different types of BPF
program, and noticed that for different program types the context is being passed differently.
Example:
For program type
BPF_PROG_TYPE_SOCK_OPS
, an object of typestruct bpf_sock_ops_kern
is passed. However, the BPF program of this type takes a reference tostruct bpf_sock_ops
. Why is it done this way and where is the "translation" frombpf_sock_ops_kern
tobpf_sock_ops
?For program type
BPF_PROG_TYPE_CGROUP_SKB
, an object of typestruct sk_buff
is passed (e.g., in__cgroup_bpf_run_filter_skb
), but the BPF program expects a minimized version,struct __sk_buff
.
So I looked at the struct bpf_verifier_ops
function callbacks, but they seem to only adjust the offsets in BPF instructions, as they are called by the BPF verifier.
I'd be glad if someone could shed light on how the BPF context is defined. Thanks.
linux-kernel - ebpf:拦截函数调用
我正在阅读有关kprobes
BPF 程序类型的信息,并且想知道是否有可能不仅拦截函数调用以进行跟踪或收集一些低级信息(寄存器、堆栈等),还可以替换调用并执行而不是实际功能?
是否kprobe
提供此功能或我正在寻找错误的工具?
linux-kernel - ebpf:存在三元查找吗?
有没有可以做三元查找map
的?ebpf
我知道存在最长前缀匹配的 LPM 映射,但我想要这样的东西:
concurrency - Linux TC eBPF 和并发性
内核可以在多个 CPU 上同时运行多少个 eBPF 程序实例是否有限制(类似于 python GIL 问题)
特别是 eBPF tc 程序可以同时在多个 CPU 上工作吗?
当 eBPF 在多个 CPU 上运行相同的代码时,它是如何锁定内核数据结构的?
networking - eBPF 支持事件吗?
是否有可能让ebpf
程序生成事件,例如数据包计数器达到预定义的阈值ebpf
并将生成一些通知/事件给用户,类似于netlink
提供的东西。
我看到目前发出此事件/状态的唯一方法是maps
用户应用程序可以通过它进行轮询。
c - 在 BPF 程序上传时解密“无效的内存访问 map_ptr”
我正在编写一个自定义应用程序,它读取 C 代码,调用 LLVM 从该 C 代码生成 BPF 字节代码,然后重新定位任何 bpf 映射符号并将其上传到内核。我可以成功上传和运行不使用 BPF 映射的程序,但是一旦我重新定位程序以使用 BPF 映射,我就会收到以下错误:
详情如下:
以下输入提供给 LLVM:
生成以下字节码
并且“a”符号在指令#4中被重新定位,如下所示:
指令#4 中的“04”是符号“a”的映射的FD。调用 BPF_PROG_LOAD 后,我在内核的错误日志中得到以下信息。
我在破译这个错误日志时遇到了麻烦。内核想告诉我什么?
linux - 未能创建地图:22 无效参数
我使用说明编译了此处提供的示例 bpf 程序 - https://github.com/torvalds/linux/tree/master/samples/bpf 。对于执行时的大多数程序,我收到此错误:
我已经检查了我系统上的相关 BPF 标志,并且它们设置正确。我正在使用 linux-4.17 源代码。
clang - LLVM BPF 后端不会将源文件名放在符号表上
我现在正在尝试从 ELF 对象中提取源 C 文件名,该对象是由 clang 从以下 C 代码编译而来的。
当我将 amd64 指定为后端时,clang 会生成如下所示的 symtab
我们可以看到源文件名在那里。但是,当我将 BPF 指定为后端时,我会看到如下所示的输出。
我们看不到源文件名。
有谁知道为什么会这样,我该如何解决这个问题?
工作环境为 Ubuntu18.04-LTS,clang 版本为 6.0.0-1ubuntu2 (tags/RELEASE_600/final),通过 apt 安装。