【问题标题】:Can Intel PT (Processor Trace) be disabled/configured from within an OS?可以从操作系统中禁用/配置英特尔 PT(处理器跟踪)吗?
【发布时间】:2015-08-14 22:28:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: debugging hardware intel trace processor


    【解决方案1】:

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

    1. 是的。来自Intel 64 and IA-32 Architectures Software Developer’s Manual 的第 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 将其数据存储在您告诉它的位置,通常是保留的内存区域或调试端口。

    【讨论】:

      【解决方案2】:

      这是在 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/

      【讨论】:

        【解决方案3】:

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

        答案:
        1)这取决于您的操作系统。任何 x86-64 操作系统都应该能够支持它,只要它看到至少为 Broadwell 或更高代的 Intel CPU,因为添加了更细粒度的时序和地址过滤功能,用户真正想要 Skylake 或更好。

        对于现在的 Linux,答案是肯定的,因为本机支持已添加到操作系统中。
        对于 Microsoft Windows,通过 ipt.sys 驱动程序向 Windows 10 添加了非官方的半文档支持。 见:https://github.com/ionescu007/winipt
        Github 上还有一些(大部分被废弃的)Windows IPT 驱动程序项目,包括一个用于“CheatEngine”的工作项目。

        2) 下载“英特尔 64 和 IA-32 架构 Software Developer's Manual”,从第 35-1 页的“第 35 章 INTEL PROCESSOR TRACE”部分开始。正如其他人所说,您通过以 IA32_RTIT_CTL 开头的一系列 9 个 MSR 寄存器设置和控制 IPT 功能。与前身 Last Branch Trace (LBT ) 特性,它们至少使支持该特性的所有 CPU 的 MSR 保持不变(尽管有些世代支持的特性比其他世代多)。

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

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

        【讨论】:

          猜你喜欢
          • 2017-08-02
          • 2011-01-08
          • 2017-03-31
          • 2011-10-15
          • 1970-01-01
          • 2020-05-24
          • 2015-09-25
          • 1970-01-01
          • 2018-04-20
          相关资源
          最近更新 更多