如何访问 eBPF 程序中的 xmm 寄存器
How do I access xmm registers in an eBPF program
我正在尝试使用 bcc-tools 来跟踪使用 uprobe 的用户进程,但有些函数采用浮点参数。根据 x86_64 ABI,这些值通常在 xmm 寄存器中传递。
bcc 中的 eBPF 函数接受一个 struct pt_regs *
参数,因为我可以访问(?的副本)大多数 "usual" 寄存器,但不能访问 xmm 寄存器。
有没有办法做到这一点?还是 eBPF 的设计中忽略了这一点
TL;DR 这不是 BPF 的问题,uprobes 和 kprobes 都不能访问 AVX 寄存器,比如 xmm 寄存器。
uprobe 程序实际上是 loaded in the kernel as kprobe programs(即 BPF_PROG_TYPE_KPROBE
)。
与大多数 BPF 程序相反,kprobe 程序可以在挂钩点访问未修改、不受限制的上下文参数。我的意思是 BPF 程序的参数通常是挂钩点给出的实际对象的镜像,访问由验证者重写。例如,有几个 BPF 程序以 struct __sk_buff
作为参数,实际上是 a mirror of sk_buff
(see for more details). kprobe program, on the contrary, have access to the raw struct pt_regs
object (the convert_ctx_access
field of struct bpf_verifier_ops
is null).
由此我们可以得出结论,kprobes(接收 struct pt_regs
)无法访问 AVX 寄存器。所以这是 kprobes 的限制,而不是 BPF 的限制。原因之一可能仅仅是内核中对 AVX 寄存器的支持较低。请参阅 this Whosebug answer 了解更多信息。
我正在尝试使用 bcc-tools 来跟踪使用 uprobe 的用户进程,但有些函数采用浮点参数。根据 x86_64 ABI,这些值通常在 xmm 寄存器中传递。
bcc 中的 eBPF 函数接受一个 struct pt_regs *
参数,因为我可以访问(?的副本)大多数 "usual" 寄存器,但不能访问 xmm 寄存器。
有没有办法做到这一点?还是 eBPF 的设计中忽略了这一点
TL;DR 这不是 BPF 的问题,uprobes 和 kprobes 都不能访问 AVX 寄存器,比如 xmm 寄存器。
uprobe 程序实际上是 loaded in the kernel as kprobe programs(即 BPF_PROG_TYPE_KPROBE
)。
与大多数 BPF 程序相反,kprobe 程序可以在挂钩点访问未修改、不受限制的上下文参数。我的意思是 BPF 程序的参数通常是挂钩点给出的实际对象的镜像,访问由验证者重写。例如,有几个 BPF 程序以 struct __sk_buff
作为参数,实际上是 a mirror of sk_buff
(see struct pt_regs
object (the convert_ctx_access
field of struct bpf_verifier_ops
is null).
由此我们可以得出结论,kprobes(接收 struct pt_regs
)无法访问 AVX 寄存器。所以这是 kprobes 的限制,而不是 BPF 的限制。原因之一可能仅仅是内核中对 AVX 寄存器的支持较低。请参阅 this Whosebug answer 了解更多信息。