我正在尝试使用bcc-tools使用uprobe跟踪用户进程,但是某些函数带有浮点参数。根据x86_64 ABI,这些值通常在xmm寄存器中传递。
bcc中的eBPF函数采用一个struct pt_regs *
参数,因为我可以访问(“?的副本”)大多数“常用”寄存器,但不能访问xmm寄存器。
有没有办法做到这一点?还是在eBPF的设计中忽略了这一点
答案 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_ops
的convert_ctx_access
字段为null)。
由此我们可以得出结论,kprobes(接收struct pt_regs
)无权访问AVX寄存器。因此,这是kprobes的限制,而不是BPF。原因之一可能只是内核中对AVX寄存器的支持不足。有关更多信息,请参见this StackOverflow answer。