assembly - 尝试获取内存访问模式统计信息时如何处理虚拟地址?

标签 assembly memory-management x86 cpu intel

我正在从事一个需要获取程序内存访问模式统计信息的项目。 (内存访问模式,我指的是内存不同区域的访问概率分布)

我使用了 Intel Pintool 并获得了所有指令的地址(指令指针)以及这些指令中访问的所有内存地址。统计是这样的: 格式为:

fprintf(trace,"%p: R/W %p\n", ip, addr); //IP Read/Write addr

0x7f096b04e2d3: W 0x7fff17713f68
0x7f096b051a70: W 0x7fff17713f60
0x7f096b051a74: W 0x7fff17713f58
0x7f096b051a76: W 0x7fff17713f50
0x7f096b051a78: W 0x7fff17713f48
0x7f096b051a7a: W 0x7fff17713f40
0x7f096b051a7c: W 0x7fff17713f38
0x7f096b051a8f: R 0x7f096b26fe70
0x7f096b051a96: W 0x7f096b26fc98
0x7f096b051aa7: R 0x7f096b270000

问题是,在CPU的角度,这些地址都是Virtual Addr,如果要获取物理内存访问模式,就不能使用。

你有什么想法吗?

最佳答案

我不确定您是否可以在 Pin 中做到这一点,但我不这么认为。您可能想查看 pagemap .这至少应该为您提供将虚拟地址转换为物理地址的资源,尽管您必须对其进行一些处理。来自文档:

The general procedure for using pagemap to find out about a process' memory usage goes like this:

  1. Read /proc/pid/maps to determine which parts of the memory space are mapped to what.
  2. Select the maps you are interested in -- all of them, or a particular library, or the stack or the heap, etc.
  3. Open /proc/pid/pagemap and seek to the pages you would like to examine.
  4. Read a u64 for each page from pagemap.
  5. Open /proc/kpagecount and/or /proc/kpageflags. For each PFN you just read, seek to that entry in the file, and read the data you want.

关于assembly - 尝试获取内存访问模式统计信息时如何处理虚拟地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30994932/

相关文章:

x86 - 如何判断CPU是否支持ECC?

assembly - 如何使用GDB打印复杂寻址模式引用的内存?

programming-languages - 世嘉 MD/Genesis 游戏最初是用什么语言和工具开发的?

assembly - 将汇编代码转换为C代码

assembly - 38 "D"D 位中的 6's "代表什么?

x86 - MASM 中 x64 和 x86 模式的区别

c - 鼠标初始化后如何从端口 60h 提取 3 或 4 字节鼠标数据包

c# - 我的类(class)使用了多少内存实例 - 务实的答案

memory-management - Spring Boot 默认内存设置是什么?

c++ - 进程终止时是否回收了内存?