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) 跟踪中心架构的中心组件。

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

GTH 允许通过其 “masters” 属性组将不同的 STP 主设备定向到不同的输出端口。更详细的 GTH 接口描述位于 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 以循环缓冲区模式运行。与“多”模式不同,它将填充缓冲区中的所有窗口,而不仅仅是第一个窗口。可以通过将 “sink” 写入 “mode” 文件来启用它(假设 msu-sink.ko 已加载)。