gpt4 book ai didi

linux - 我可以通过X86_64机器码获取内存访问信息吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:58 25 4
gpt4 key购买 nike

我想对在 Linux(X86_64 架构)上运行的程序进行内存字节访问统计。我使用 perf 工具像这样转储文件:

                 :      ffffffff81484700 <load2+0x484700>:
2.86 : ffffffff8148473b: 41 8b 57 04 mov 0x4(%r15),%edx
5.71 : ffffffff81484800: 65 8b 3c 25 1c b0 00 mov %gs:0xb01c,%edi
22.86 : ffffffff814848a0: 42 8b b4 39 80 00 00 mov 0x80(%rcx,%r15,1),%esi
25.71 : ffffffff814848d8: 42 8b b4 39 80 00 00 mov 0x80(%rcx,%r15,1),%esi
2.86 : ffffffff81484947: 80 bb b0 00 00 00 00 cmpb $0x0,0xb0(%rbx)
2.86 : ffffffff81484954: 83 bb 88 03 00 00 01 cmpl $0x1,0x388(%rbx)
5.71 : ffffffff81484978: 80 79 40 00 cmpb $0x0,0x40(%rcx)
2.86 : ffffffff8148497e: 48 8b 7c 24 08 mov 0x8(%rsp),%rdi
5.71 : ffffffff8148499b: 8b 71 34 mov 0x34(%rcx),%esi
5.71 : ffffffff814849a4: 0f af 34 24 imul (%rsp),%esi

我现在的方法是分析文件,得到所有的内存访问指令,比如movecmp等,然后计算每条指令的访问字节数,比如mov 0x4(%r15),%edx 将添加 4 字节。

我想知道有没有可能通过机器码来计算,比如分析“41 8b 57 04”,我也可以加上 4 字节。因为我不熟悉X86_64 机器代码,谁能提供任何线索?或者有什么更好的统计方法吗?提前致谢!

最佳答案

参见 https://stackoverflow.com/a/20319753/120163有关解码英特尔指令的信息;事实上,您确实需要引用英特尔引用手册:http://download.intel.com/design/intarch/manuals/24319101.pdf如果您只是为了一些说明而手动执行此操作,则只需查找这些手册中的数据即可。

如果您想自动计算指令总内存访问量,您将需要一个函数将指令映射到访问的数据量。由于指令集复杂,相应的功能也会很复杂,需要很长时间从头开始编写。

我的答案 https://stackoverflow.com/a/23843450/120163提供将 x86-32 指令映射到其长度的 C 代码,给定一个包含二进制代码块的缓冲区。如果要从目标代码缓冲区中的某个点开始并简单地枚举正在使用的指令,则此类代码是必需的。 (此代码已在生产中使用;非常可靠)。这个例程基本上是通过仔细阅读英特尔引用手册构建的。对于 OP,这必须扩展到 x86-64,这应该不是很难,主要是您已经考虑了扩展寄存器前缀操作码字节和与 x86-32 的一些差异。

要解决 OP 的问题,还可以修改此例程以返回每条指令读取的字节数。后者的数据也必须通过仔细检查英特尔引用手册来提取。

OP 还必须担心他从哪里获得目标代码;如果他不在目标代码本身的地址空间中运行此例程,他将需要以某种方式从 .exe 文件中获取此目标代码。为此,他需要构建或运行 Windows 加载程序的等效项,我敢打赌有一堆阴暗的角落。检查目标代码文件的格式。

关于linux - 我可以通过X86_64机器码获取内存访问信息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28270694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com