我正在从事一个需要获取程序内存访问模式统计信息的项目。 (内存访问模式,我指的是内存不同区域的访问概率分布)
我使用了 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:
- Read /proc/pid/maps to determine which parts of the memory space are mapped to what.
- Select the maps you are interested in -- all of them, or a particular library, or the stack or the heap, etc.
- Open /proc/pid/pagemap and seek to the pages you would like to examine.
- Read a u64 for each page from pagemap.
- 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/