首页 > 解决方案 > 使用 ptrace PTRACE_GETREGS 与 PTRACE_PEEKUSER 性能注册

问题描述

如果我需要获取某些寄存器的值,ptrace例如我需要 r0 、 r1 、pc 寄存器,那么哪种方式会给我带来更好的性能:

int pc= ptrace(PTRACE_PEEKUSER,pid,60,0);

r0 = ptrace(PTRACE_PEEKUSER, pid, 0, NULL);

r1 = ptrace(PTRACE_PEEKUSER, pid, 4, NULL);

或者获取所有寄存器,PTRACE_GETREGS然后只使用我需要的值?

那是如何实现的?是否PTRACE_GETREGS作为循环实现,PTRACE_PEEKUSER所以如果我不需要所有寄存器,最好的方法是使用PTRACE_PEEKUSER我需要的寄存器数量?

性能是否取决于架构(x86/Arm)?

标签: clinuxperformancearmptrace

解决方案


那是如何实现的?

ptrace 我们拱依赖。

linux内核中的arm ptrace实现是(arch/arm/kernel/ptrace.c)[ https://elixir.bootlin.com/linux/latest/source/arch/arm/kernel/ptrace.c#L784]

如果我不需要所有寄存器,最好的方法是使用 PTRACE_PEEKUSER 作为我需要的寄存器数量?

按照上面的代码。PTRACE_GETREGS不是迭代结束PTRACE_PEEKUSERPTRACE_GETREGS根据@Nate Eldredge 的评论,这似乎是一个更好的选择。多个系统调用比获取寄存器的成本更高。

性能是否取决于架构(x86/Arm)?

是的,ptrace 代码不同,因此它也会产生影响,寄存器数量也会发生变化,读取寄存器的汇编指令也会不同。


这些都是知识渊博的答案。如果您还有更多问题/疑问/澄清,请随时发表评论,我会尽力回答。

最后是我关于性能的 2 美分

性能取决于各种因素,因此与最佳编码一起,实际测试比较是更好的方法。使用代码创建多个测试并执行它们以验证您的假设。在硬件和编译器优化中发生了很多事情,所以

在 arm 和 x86 上测试您的代码,以了解您在特定情况下的性能的正确答案。


推荐阅读