我使用的是Linux内核4.19.90,我可以在一个bpf程序调用中获得参数和返回值吗?或者我只能将参数保存到映射中,并在"sys_exit_"期间从映射中提取参数。
我只想在一个跟踪点函数中获得参数和返回值。否则,将进程参数保存到映射中,键为<pid,>安全吗?
不能在单个程序调用中同时获得系统调用的参数和结果。理论上,您可以使用一个原始跟踪点来让一个eBPF程序处理入口和返回,但这只会使您的目标更难实现。
使用地图的技术是可行的。在入口点放置一个程序来记录参数。然后在返回处使用第二个程序来添加返回值,从映射中删除键并"提交"。结果,例如通过BPF_MAP_TYPE_PERF_EVENT_ARRAY
映射。
因为一个线程一次只能执行一个系统调用(它被阻塞,直到系统调用返回),我们可以使用pid/tgid组合作为唯一的ID和键在两个程序之间传输数据。您可以使用bpf_get_current_pid_tgid
帮助器来获取它。
虽然您可以同时为多个系统调用使用一个映射,但可能更容易为每个程序创建一个映射-为pid-tgid设置键为__u64
,并且值等于系统调用参数+返回代码,每个系统调用将不同。