如果我需要使用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)?
发布于 2020-05-20 15:16:48
是如何实现的?
我们依赖弓。
对于linux内核中的arm,ptrace.c实现是(arch/arm//ptrace.c)[https://elixir.bootlin.com/linux/latest/source/arch/arm/kernel/ptrace.c#L784]。
--如果我不需要所有的寄存器,最好的方法是使用PTRACE_PEEKUSER作为我需要的寄存器的数量?
按照上面的代码。PTRACE_GETREGS不是PTRACE_PEEKUSER上的迭代。因此,按照@Nate的评论,PTRACE_GETREGS似乎是一个更好的选择。多个syscall的成本比获得注册服务器要高。
的性能是否取决于体系结构(x86/Arm)?
是的,ptrace代码是不同的,所以它会产生影响,寄存器的数量也会改变,读取寄存器的程序集指令也会有所不同。
这是最好的答案。如果你有更多的问题/疑问/澄清
最后,我的2分钱关于性能
性能取决于各种因素,因此,随着优化编码,实际的测试比较是更好的方式。使用代码创建多个测试,并执行它们以验证您的假设。很多事情发生在硬件和编译器的优化中,所以
在arm和x86上测试您的代码,以了解在特定情况下性能的正确答案。
https://stackoverflow.com/questions/61743912
复制相似问题