我正在尝试通过使用硬件性能计数器生成 D-TLB 未命中的地址跟踪。英特尔处理器具有“基于事件的精确采样”(PEBS),可以在每次采样时转储硬件寄存器内容。我需要使用这个寄存器转储来创建导致 D-TLB 未命中的地址。但是,我不确定如何从寄存器转储中生成访问地址。
有人有做类似事情的经验,可以给我一些指示吗?
谢谢
阿尔卡
我正在尝试通过使用硬件性能计数器生成 D-TLB 未命中的地址跟踪。英特尔处理器具有“基于事件的精确采样”(PEBS),可以在每次采样时转储硬件寄存器内容。我需要使用这个寄存器转储来创建导致 D-TLB 未命中的地址。但是,我不确定如何从寄存器转储中生成访问地址。
有人有做类似事情的经验,可以给我一些指示吗?
谢谢
阿尔卡
性能计数器基本上是计数器,您需要它们不提供的额外信息。您需要的是一个能够捕获总线事务的跟踪器,这可能有点难以实现,并且仍然不是完美的,因为您只会捕获也错过了 STLB(第二级 TLB)的未命中,另外 - 他们的页面walk 阶段没有命中缓存,因此您可以有足够的可见性来重建虚拟地址。在我看来,您最好的选择是简单地通过二进制检测工具(例如 PIN 或 szim)运行您的代码,编写一个钩子来捕获所有内存访问 - 并通过模拟 DTLB 的回调运行它们(您可以使用几个uarch模拟器或者自己写一些简单的代码)。您只需要获取系统的基本 DTLB 详细信息(大小、关联性等)。这应该让您对真实系统上的 DTLB 丢失地址有一个相对接近的了解。当然,如果您使用混合大小的页面或虚拟化(上帝保佑..),这里可能会出现复杂情况