我正在开发一个需要获取程序内存访问模式统计信息的项目。 (通过内存访问模式,我的意思是不同内存区域的访问概率分布)
我使用了英特尔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,如果我想获得物理内存访问模式,则无法使用。
你有什么想法吗?
答案 0 :(得分:0)
我不确定你是否可以在Pin中做到这一点,但我不这么认为。您可能想查看pagemap。这应该至少为您提供了将虚拟地址转换为物理地址的资源,尽管您必须稍微处理它。来自文档:
使用pagemap查找进程的一般步骤' 内存使用情况如下:
- 读取/ proc / pid / maps以确定内存空间的哪些部分 映射到什么。
- 选择您感兴趣的地图 - 所有地图或特定地图 库,或堆栈或堆等
- 打开/ proc / pid / pagemap并寻找您想要检查的页面。
- 从页面地图中为每个页面读取一个u64。
- 打开/ proc / kpagecount和/或/ proc / kpageflags。对于每个PFN,你只需要 读取,在文件中查找该条目,并读取您想要的数据。
醇>