我想查看我的程序正在访问哪些页面.
您可以模拟CPU并获取此数据.变种:
但是,这涉及为所有存储器页设置保护位的开销
这个开销太大了吗?
现在的问题是如何处理Linux程序的用户空间中的TLB未命中.
你无法在内核空间(在x86和许多其他流行的平台上)处理未命中或用户空间.这是因为大多数平台管理硬件中的 TLB未命中:.MMU(CPU /芯片组的一部分)将在页表上执行操作,并将透明地获取物理地址.仅当设置了某些位或未映射地址区域时,才会生成页面错误中断并将其传送到内核.
此外,似乎没有办法在现代CPU中转储TLB(但386DX能够达到此目的)
您可以尝试通过引入的延迟来检测TLB未命中.但是这种延迟可以通过TLB查找的无序启动来隐藏.
此外,大多数硬件事件(内存访问,tlb访问,tlb命中,tlb未命中)都由硬件性能监视计算(这部分CPU由Vtune,CodeAnalyst和oprofile使用).不幸的是,这只是事件的全局计数器,您不能同时激活2-4个以上的事件.好消息是,当达到一些计数时,你可以将perfmon计数器设置为中断.然后,您将获得(通过中断)指令的地址($ eip),其中已达到计数.所以,你可以找到这个硬件的TLB-miss-heavy热点(它在每个现代的x86 cpu中;无论是intel还是amd).