Intel(R) 追踪中心 (TH)

概述

Intel(R) 追踪中心 (TH) 是一组硬件模块,它们从多个硬件和软件源生成、切换和输出追踪数据,通过以系统追踪协议 (MIPI STPv2) 编码的多种类型的追踪输出端口,旨在执行完整的系统调试。有关硬件的更多信息,请参阅 Intel(R) 追踪中心开发者手册 [1]。

它由追踪源、追踪目的地(输出)和一个交换机(全局追踪中心,GTH)组成。这些设备放置在它们自己的总线(“intel_th”)上,可以通过 sysfs 属性发现和配置。

目前,支持以下 Intel TH 子设备(模块):
  • 软件追踪中心 (STH),追踪源,它是一个系统追踪模块 (STM) 设备,

  • 内存存储单元 (MSU),追踪输出,允许将追踪中心输出存储在系统内存中,

  • 并行追踪接口输出 (PTI),通过 PTI 端口输出到外部调试主机,

  • 全局追踪中心 (GTH),它是一个交换机,也是 Intel(R) 追踪中心架构的核心组件。

输出设备的通用属性在 Documentation/ABI/testing/sysfs-bus-intel_th-output-devices 中描述,其中最值得注意的是“active”,它启用或禁用到该特定输出设备的追踪输出。

GTH 允许通过其“masters”属性组将不同的 STP 主控设备定向到不同的输出端口。更详细的 GTH 接口描述位于 Documentation/ABI/testing/sysfs-bus-intel_th-devices-gth。

STH 注册一个 stm 类设备,通过该设备它为用户空间和内核空间软件追踪源提供接口。有关更多信息,请参阅系统追踪模块

MSU 可以配置为将追踪数据收集到系统内存缓冲区中,然后可以通过 read() 或 mmap() 接口从其设备节点读取,并定向到“软件接收器”驱动程序,该驱动程序将消耗数据和/或进一步转发数据。

总而言之,Intel(R) 追踪中心不需要任何特殊的用户空间软件即可运行;一切都可以通过 sysfs 属性和设备节点进行配置、启动和收集。

[1] https://software.intel.com/sites/default/files/managed/d3/3c/intel-th-developer-manual.pdf

总线和子设备

对于系统中每个 Intel TH 设备,都会创建自己的总线并分配一个 ID 号,该 ID 号反映了 TH 设备的枚举顺序。所有 TH 子设备(intel_th 总线上的设备)都以此 ID 开头:0-gth、0-msc0、0-msc1、0-pti、0-sth,后跟设备名称和一个可选索引。

输出设备还在 /dev/intel_thN 中获取一个设备节点,其中 N 是 Intel TH 设备 ID。例如,MSU 的内存缓冲区在分配后,可以通过 /dev/intel_th0/msc{0,1} 访问。

快速示例

# 找出哪个 GTH 端口是第一个内存控制器

$ cat /sys/bus/intel_th/devices/0-msc0/port
0

# 看起来是端口 0,配置主设备 33 将数据发送到端口 0

$ echo 0 > /sys/bus/intel_th/devices/0-gth/masters/33

# 在第一个内存控制器上分配一个 2 窗口多块缓冲区,每个缓冲区 64 页

$ echo multi > /sys/bus/intel_th/devices/0-msc0/mode
$ echo 64,64 > /sys/bus/intel_th/devices/0-msc0/nr_pages

# 也为此控制器启用环绕

$ echo 1 > /sys/bus/intel_th/devices/0-msc0/wrap

# 并启用到此端口的追踪

$ echo 1 > /sys/bus/intel_th/devices/0-msc0/active

# .. 将数据发送到主设备 33,有关更多详细信息,请参阅系统追踪模块 .. # .. 等待追踪堆积 .. # .. 并停止追踪

$ echo 0 > /sys/bus/intel_th/devices/0-msc0/active

# 现在你可以从设备节点收集追踪数据

$ cat /dev/intel_th0/msc0 > my_stp_trace

主机调试器模式

可以从远程调试主机配置追踪中心并控制其追踪捕获,该主机应通过其中一个硬件调试接口连接,然后将该接口用于控制 Intel 追踪中心并将追踪数据传输到调试主机。

需要告知驱动程序正在进行这样的安排,以便它不触及任何捕获/端口配置,并避免与调试主机的配置访问冲突。驱动程序在此模式下执行的唯一活动是将软件追踪收集到软件追踪中心(一个 stm 类设备)。用户仍然负责设置接收端解码器可以识别的适当的主设备/通道映射。

为了启用主机模式,请将“intel_th”内核模块的“host_mode”参数设置为“y”。任何虚拟输出设备都不会显示在 intel_th 总线上。此外,也不会公开“gth”设备的追踪配置和捕获控制属性组。“sth”设备将像往常一样运行。

软件接收器

内存存储单元 (MSU) 驱动程序为驱动程序提供了一个内核 API,用于将它们自身注册为追踪数据的软件接收器。此类驱动程序可以进一步通过其他设备(如 USB 设备控制器或网卡)导出数据。

该 API 有两个主要部分:
  • 通知软件接收器特定窗口已满,并“锁定”该窗口,即使其无法用于追踪收集;发生这种情况时,MSU 驱动程序将自动切换到缓冲区中的下一个窗口(如果它已解锁),如果未解锁,则停止追踪捕获;

  • 跟踪窗口的“锁定”状态,并为软件接收器驱动程序提供一种在窗口解锁并可以再次用于收集追踪数据时通知 MSU 驱动程序的方法。

示例接收器驱动程序 msu-sink 说明了软件接收器的实现。从功能上讲,它只是在窗口满后立即解锁窗口,使 MSU 以循环缓冲区模式运行。与“multi”模式不同,它将填充缓冲区中的所有窗口,而不仅仅是第一个窗口。可以通过将“sink”写入“mode”文件来启用它(假设已加载 msu-sink.ko)。