系统跟踪模块¶
系统跟踪模块 (STM) 是 MIPI STP 规范中描述的设备,作为 STP 跟踪流生成器。STP(系统跟踪协议)是一种跟踪协议,它复用来自多个跟踪源的数据,每个跟踪源都分配了一个唯一的主站和通道对。虽然其中一些主站和通道是静态分配给某些硬件跟踪源的,但其他主站和通道可供软件使用。软件跟踪源通常可以从这个池中自由选择任何主站/通道组合。
在这个 STP 流的接收端(解码器端),跟踪源只能通过主站/通道组合来识别,因此为了使解码器能够理解涉及多个跟踪源的跟踪,它需要能够将这些主站/通道对映射到它理解的跟踪源。
例如,知道 syslog 消息来自主站 7 通道 15,而任意用户应用程序可以使用主站 48 到 63 和通道 0 到 127 是很有帮助的。
为了解决这个映射问题,stm 类通过 configfs 提供了一个策略管理机制,该机制允许定义将字符串标识符映射到主站和通道范围的规则。如果这些规则(策略)与解码器的期望一致,它将能够正确处理跟踪数据。
此策略是一个树结构,其中包含位于 configfs 的“stp-policy”子系统目录中的规则 (policy_node),这些规则具有名称(字符串标识符)以及与之关联的主站和通道范围。最顶层目录的名称(策略)的格式为应用此策略的 STM 设备名称和一个用点分隔的任意字符串标识符。从上面的示例中,规则可能如下所示
$ ls /config/stp-policy/dummy_stm.my-policy/user
channels masters
$ cat /config/stp-policy/dummy_stm.my-policy/user/masters
48 63
$ cat /config/stp-policy/dummy_stm.my-policy/user/channels
0 127
这意味着此规则的主站分配池由主站 48 到 63 组成,通道分配池中包含通道 0 到 127。现在,任何使用“user”标识字符串标识自己的生产者(跟踪源)都将从这些范围中分配一个主站和通道。
这些规则可以嵌套,例如,可以从上面的示例中的“user”目录下定义一个规则“dummy”,这个新规则将用于 ID 字符串为“user/dummy”的跟踪源。
跟踪源必须打开 stm 类设备的节点并将它们的跟踪数据写入其文件描述符。
为了找到给定跟踪源的适当策略节点,可以使用多种机制。首先,跟踪源可以通过在字符设备的文件描述符上调用 STP_POLICY_ID_SET ioctl 来显式标识自己,并在那里写入任何数据之前提供它们的 id 字符串。其次,如果它们选择不执行显式标识(因为您可能不想修补现有软件来执行此操作),它们可以只是开始写入数据,此时 stm 内核将尝试查找名称与任务名称(例如,“syslogd”)匹配的策略节点,如果存在,则将使用该节点。第三,如果在策略节点中找不到任务名称,则将使用通配符条目“default”(如果存在)。此条目也需要由系统管理员或任何负责策略配置的工具创建和配置。最后,如果上述所有步骤都失败,则写入 stm 文件描述符将返回错误 (EINVAL)。
以前,如果没有为跟踪源找到任何策略节点,stm 类会默默地回退到从设备的主站/通道范围的开头分配第一个可用的连续主站/通道范围。对策略节点存在的新要求将帮助程序员和系统管理员识别配置中的差距,并更好地控制未识别的源。
一些 STM 设备可能允许将通道 mmio 区域直接映射到用户空间以进行零复制写入。一个可映射页(在 mmu 方面)通常包含多个通道的 mmio,因此用户需要(通过上述 ioctl() 调用)为自己分配那么多通道才能执行此操作。也就是说,如果您的 stm 设备的通道 mmio 区域为 64 字节,并且硬件页面大小为 4096 字节,那么在成功调用宽度为 64 的 STP_POLICY_ID_SET ioctl() 之后,您应该能够在文件描述符上 mmap() 一个页面,并获得对 64 个通道的 mmio 区域的直接访问权限。
STM 设备的示例有英特尔(R) 跟踪中心 [1] 和 Coresight STM [2]。
stm_source¶
对于基于内核的跟踪源,有一个“stm_source”设备类。此类的设备可以通过写入所需的 stm 设备名称(例如)在运行时连接和断开与 stm 设备的连接/断开,通过一个名为“stm_source_link”的 sysfs 属性:
$ echo dummy_stm.0 > /sys/class/stm_source/console/stm_source_link
有关如何在内核中使用 stm_source 接口的示例,请参阅 stm_console、stm_heartbeat 或 stm_ftrace 驱动程序。
每个 stm_source 设备都需要假设一个主站和一系列通道,具体取决于它需要多少通道。这些是根据策略配置为设备分配的。如果策略目录的根目录中存在与 stm_source 设备名称(例如,“console”)匹配的节点,则将使用此节点来分配主站和通道号。如果没有这样的策略节点,stm 内核将使用通配符条目“default”(如果存在)。如果这两个策略节点都不存在,则写入 stm_source_link 将返回一个错误。
stm_console¶
此接口的一个实现(也在上面的示例中使用)是“stm_console”驱动程序,它基本上为内核消息通过 stm 设备提供单向控制台。
要配置将在此 STP 流中分配给此控制台的主站/通道对,请创建一个“console”策略条目(请参阅本文档开头有关如何执行此操作的信息)。初始化后,它将占用一个通道。
stm_ftrace¶
这是另一个“stm_source”设备,一旦 stm_ftrace 已与 stm 设备连接,并且如果启用了“function”跟踪器,则 Ftrace 子系统将存储到环形缓冲区中的函数地址和父函数地址也将同时通过 stm 设备导出。
目前仅支持 Ftrace “function”跟踪器。