c - 使用 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)?
解决方案
那是如何实现的?
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_PEEKUSER
。PTRACE_GETREGS
根据@Nate Eldredge 的评论,这似乎是一个更好的选择。多个系统调用比获取寄存器的成本更高。
性能是否取决于架构(x86/Arm)?
是的,ptrace 代码不同,因此它也会产生影响,寄存器数量也会发生变化,读取寄存器的汇编指令也会不同。
这些都是知识渊博的答案。如果您还有更多问题/疑问/澄清,请随时发表评论,我会尽力回答。
最后是我关于性能的 2 美分
性能取决于各种因素,因此与最佳编码一起,实际测试比较是更好的方法。使用代码创建多个测试并执行它们以验证您的假设。在硬件和编译器优化中发生了很多事情,所以
在 arm 和 x86 上测试您的代码,以了解您在特定情况下的性能的正确答案。
推荐阅读
- django - 尝试安装样板 Django 时没有名为“app”的模块
- python - ChatterBot 错误-OSError:[E941] 找不到模型“en”
- python - Scrapy-Splash 不渲染此站点
- python - 如何使用 pyspark 读取带有附加逗号的 csv 文件?
- logging - ANSIBLE 将部分任务输出存储在本地文件中
- python - 如何在 matplotlib 中分隔直方图?
- firebase - NEXT_PUBLIC 不能与 firebase-messaging-sw.js 一起使用
- flutter - AudioPlayer 搜索选项没有移动到正确的位置
- django - 重复键值违反唯一约束“unique_followuser”
- c++ - 在 macOS 上使用 Visual Studio Code 调试 C++ 标准库