我正在尝试使用 bcc-tools 跟踪使用 uprobe 的用户进程,但某些函数采用浮点参数。根据 x86_64 ABI,这些值通常在 xmm 寄存器中传递。
bcc 中的 eBPF 函数接受一个struct pt_regs *
参数,这样我就可以访问(?的副本)大多数“常用”寄存器,但不能访问 xmm 寄存器。
有办法实现这个吗?或者这是 eBPF 设计中忽略的一点
答案1
总结这不是 BPF 的问题,uprobes 和 kprobes 都无法访问 AVX 寄存器,例如 xmm 寄存器。
uprobe 计划实际上作为 kprobe 程序加载到内核中(IE,BPF_PROG_TYPE_KPROBE
)。
与大多数 BPF 程序相反,kprobe 程序可以在钩子点访问未修改、不受限制的上下文参数。我的意思是,BPF 程序的参数通常是钩子点处给出的实际对象的镜像,访问权限由验证器重写。例如,几个 BPF 程序接受一个struct __sk_buff
参数,它实际上是一面镜子sk_buff
(看这个其他的 StackOverflow 答案详细信息)。相反,kprobe 程序可以访问原始对象struct pt_regs
(convert_ctx_access
struct bpf_verifier_ops
是无效的)。
由此我们可以得出结论,kprobes(接收struct pt_regs
)无法访问 AVX 寄存器。因此,这是 kprobes 的限制,而不是 BPF 的限制。其中一个原因可能只是内核对 AVX 寄存器的支持程度较低。请参阅这个 StackOverflow 答案了解更多信息。