英特尔 PT(处理器跟踪)可以来自 OS 中的 disabled/configured 吗?

Can Intel PT (Processor Trace) be disabled/configured from within an OS?

我有一些关于Intel PT 的问题(一直在尝试破解手册但非常困难)。我的问题是:

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

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

我目前也在研究如何使用 Intel PT。据我所知:

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

IA32_RTIT_CTL, at address 570H, is the primary enable and control MSR for trace packet generation. Bit positions are listed in Table 36-5.

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

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

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

这是在 4.3 中启用 Intel 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 中的文档,了解如何使用。

Intel的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/

五年前撰写本文时,它确实出现在搜索中,这是 2020 年的更新:

答案:
1) 这取决于你的 OS。任何 x86-64 OS 都应该能够支持它,只要它看到英特尔 CPU 至少是 Broadwell 或更一代,用户真正想要 Skylake 或更好的,因为更细粒度的定时和地址过滤添加了功能。

最近 Linux 的回答是肯定的,因为本机支持已添加到 OS。
对于 Microsoft Windows,通过 ipt.sys 驱动程序向 Windows 10 添加了非官方的半文档化支持。 参见:https://github.com/ionescu007/winipt
在 Github 上还有一些(大部分已废弃)Windows IPT 驱动程序项目,其中包括 "CheatEngine" 的工作项目。

2) 下载“Intel 64 and IA-32 Architectures 软件开发人员手册”,从第 35-1 页 "CHAPTER 35 INTEL PROCESSOR TRACE" 部分开始。正如其他人所述,您通过一系列以 IA32_RTIT_CTL 开头的 9 个 MSR 寄存器来设置和控制 IPT 功能。与先行者 Last Branch Trace 不同(LBT) 功能,他们至少使所有支持该功能的 CPU 的 MSR 保持不变(尽管有些代比其他代支持更多的功能)。

缺乏完整的文档,但Intel手册确实列出了如何控制和读取IPT跟踪数据,您可以跟进使用iptlib Intel参考解码器进行解码。

3) 请参阅我的回答 #2。同样,该手册主要告诉您如何做这些事情,此外,您还可以查看几个 Github 驱动程序项目,看看它们是如何做的。您可以将该功能设置为使用循环缓冲区或在内部物理内存缓冲区(您设置的)已满等时触发中断。