如何在eBPF程序中访问xmm寄存器

时间:2019-01-16 13:13:26

标签: x86-64 tracing bpf ebpf

我正在尝试使用bcc-tools使用uprobe跟踪用户进程,但是某些函数带有浮点参数。根据x86_64 ABI,这些值通常在xmm寄存器中传递。

bcc中的eBPF函数采用一个struct pt_regs *参数,因为我可以访问(“?的副本”)大多数“常用”寄存器,但不能访问xmm寄存器。

有没有办法做到这一点?还是在eBPF的设计中忽略了这一点

1 个答案:

答案 0 :(得分:3)

TL; DR 这对于BPF而言不是问题,既不是uprobes也不是kprobes都可以访问诸如xmm寄存器之类的AVX寄存器。


装饰程序实际上是loaded in the kernel as kprobe programs(即BPF_PROG_TYPE_KPROBE)。

与大多数BPF程序相反,kprobe程序可以在挂钩点访问未经修改,不受限制的上下文参数。我的意思是BPF程序的参数通常是在挂钩点给出的实际对象的镜像,访问由验证者重写。例如,几个BPF程序将struct __sk_buff作为参数,实际上是a mirror of sk_buff(有关更多详细信息,请参见this other StackOverflow answer)。相反,kprobe程序可以访问原始struct pt_regs对象(struct bpf_verifier_opsconvert_ctx_access字段为null)。

由此我们可以得出结论,kprobes(接收struct pt_regs)无权访问AVX寄存器。因此,这是kprobes的限制,而不是BPF。原因之一可能只是内核中对AVX寄存器的支持不足。有关更多信息,请参见this StackOverflow answer