可以在OS中禁用/配置Intel PT(处理器跟踪)吗?

时间:2015-06-01 12:47:23

标签: debugging hardware intel trace processor

我有很多关于英特尔PT的问题(一直试图解码手册,但非常困难)。我的问题是:

  1. 我试图找出是否可以在操作系统内禁用或重新配置英特尔PT,或者更一般地说,是从系统内部提供跟踪。
  2. 英特尔PT是否会在写入特定寄存器时生成事件 - 例如CR3,IDTR等
  3. 英特尔PT可以将值写回系统 - 即外部调试机器是否可以主动执行对寄存器,缓存或内存的写入?

    非常感谢任何帮助,谢谢你!

3 个答案:

答案 0 :(得分:5)

我目前也正在研究如何使用英特尔PT。据我所知:

  1. 是。来自Intel 64 and IA-32 Architectures Software Developer’s Manual
  2. 的第36.2.5.2节
      

    IA32_RTIT_CTL,地址570H,是主要的启用和控制MSR   用于跟踪数据包生成。位位置在表36-5中列出。

    您可以清除或设置IA32_RTIT_CTL MSR以禁用或启用PT跟踪。这可以从系统内部提供PT提供的痕迹。事实上,我不认为它可以通过任何其他方式完成。

    1. 是。当发生对CR3寄存器的修改时,创建寻呼信息包(PIP)。但是不确定IDTR和其他人。此外,CR3寄存器可用于跟踪滤波。

    2. 英特尔PT背后的整个理念是数据包编码和解码。当x事件发生时,生成y数据包。你的工作是"解码"这个CPU提供了数据并从中获得了一些高级感。此外,您可以"编码"数据包并将它们送入系统进行解码。同样,解码器(以及可选的编码器)功能是您的工作。您可以查看英特尔的开源解码器/编码器库参考实现here。我建议在Linux下尝试使用最新的稳定内核(截至本文撰写时为4.1.3)。 值得注意的是,PT将其数据存储在您告诉它的位置,通常是保留的内存区域或调试端口。

答案 1 :(得分:2)

这是允许在4.3中使用英特尔PT的补丁:

https://lkml.org/lkml/2013/12/11/233

https://lkml.org/lkml/2015/9/24/181

https://lkml.org/lkml/2015/9/27/45

这是关于PT与LBT等其他英特尔功能的互动:

https://lkml.org/lkml/2014/7/31/572

阅读tools / perf / Documentation / intel-pt.txt上关于使用方法的文档。

来自英特尔的Andi Kleen是Skylakes / Broadwell补丁的创始人(只有这两个处理器和Atom系列支持Intel PT),并且他有用户空间工具来演示它用于调试:

https://github.com/andikleen/simple-pt

有关详细信息,请参阅:

https://tthtlc.wordpress.com/2016/01/26/intel-processor-trace-how-to-use-it/

答案 2 :(得分:1)

撰写本文时,距今已有五年之久,但确实出现在搜索中,这是2020年的更新:

答案:
1)取决于您的操作系统。只要x86-64操作系统看到的英特尔CPU至少为Broadwell或更高版本,它就应该能够支持它,因为添加了更细粒度的定时和地址过滤功能,用户真正希望使用Skylake或更高版本的处理器。

如今,对于Linux来说,答案是肯定的,因为向操作系统添加了本机支持。
对于Microsoft Windows,通过ipt.sys驱动程序向Windows 10添加了非正式的半文档支持。 参见:https://github.com/ionescu007/winipt
另外,在Github上有一些Windows IPT驱动程序项目(大部分已被放弃),包括“ CheatEngine”的可用项目。

2)下载“英特尔64和IA-32架构 从软件开发人员手册”开始,在第35-1页的“第35章英特尔处理器跟踪”部分。另有声明时,您通过一系列以IA32_RTIT_CTL开头的9个MSR寄存器来设置和控制IPT功能。 )功能,至少使支持该功能的所有CPU的MSR保持不变(尽管某些世代比其他世代支持更多的功能)。

缺少总体文档,但是英特尔手册确实提供了如何控制和读取IPT跟踪数据的信息,您可以对其进行后续操作,以使用iptlib英特尔参考解码器进行解码。

3)参见我的答案#2。再次,该手册主要告诉您如何执行这些操作,此外,您还可以查看一些Github驱动程序项目,并查看它们的操作方式。您可以将功能设置为使用循环缓冲区,或者在其内部物理内存缓冲区(由您设置)变满时触发中断。