系统跟踪模块¶
系统跟踪模块 (STM) 是一种设备,在 MIPI STP 规范中被描述为 STP 跟踪流生成器。 STP(系统跟踪协议)是一种跟踪协议,用于复用来自多个跟踪源的数据,每个跟踪源都被分配了一个唯一的主通道对。 虽然其中一些主通道静态分配给某些硬件跟踪源,但其他主通道可供软件使用。 软件跟踪源通常可以自由地从该池中选择任何主/通道组合。
在此 STP 流的接收端(解码器端),跟踪源只能通过主/通道组合来识别,因此为了使解码器能够理解涉及多个跟踪源的跟踪,它需要能够将这些主/通道对映射到它能够理解的跟踪源。
例如,了解 syslog 消息来自主通道 7 通道 15 会很有帮助,而任意用户应用程序可以使用主通道 48 到 63 和通道 0 到 127。
为了解决这个映射问题,stm 类通过 configfs 提供了一种策略管理机制,允许定义规则,将字符串标识符映射到主通道和通道的范围。 如果这些规则(策略)与解码器的期望一致,它将能够正确处理跟踪数据。
此策略是一个树结构,包含规则 (policy_node),这些规则具有名称(字符串标识符)以及与之关联的主通道和通道范围,位于 configfs 中的“stp-policy”子系统目录中。 从上面的示例来看,一个规则可能如下所示
$ 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 文件描述符的 write() 将返回错误 (EINVAL)。
以前,如果没有为跟踪源找到策略节点,stm 类将静默地回退到从设备的主通道范围的开头分配第一个可用的连续主通道/通道范围。 对策略节点存在的新要求将帮助程序员和系统管理员识别配置中的差距,并更好地控制未识别的源。
某些 STM 设备可能允许将通道 mmio 区域直接映射到用户空间,以便进行零拷贝写入。 一个可映射页面(就 mmu 而言)通常包含多个通道的 mmios,因此用户需要为自己分配那么多通道(通过前面提到的 ioctl() 调用)才能执行此操作。 也就是说,如果您的 stm 设备的通道 mmio 区域是 64 字节,并且硬件页面大小是 4096 字节,那么在使用 width==64 成功调用 STP_POLICY_ID_SET ioctl() 后,您应该能够在此文件描述符上 mmap() 一个页面,并获得对 64 个通道的 mmio 区域的直接访问。
STM 设备的示例包括 Intel(R) Trace Hub [1] 和 Coresight STM [2]。
stm_source¶
对于基于内核的跟踪源,有“stm_source”设备类。 此类的设备可以在运行时通过 sysfs 属性“stm_source_link”连接到 stm 设备或从 stm 设备断开连接,方法是写入所需 stm 设备的名称,例如
$ 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 的 write() 将返回错误。
stm_console¶
此接口的一个实现(也在上面的示例中使用)是“stm_console”驱动程序,它基本上为通过 stm 设备发送内核消息提供单向控制台。
要在 STP 流中配置将分配给此控制台的主通道/通道对,请创建一个“console”策略条目(请参阅本文开头有关如何执行此操作的说明)。 初始化后,它将消耗一个通道。
stm_ftrace¶
这是另一个“stm_source”设备,一旦 stm_ftrace 已与 stm 设备链接,并且如果启用了“function”跟踪器,则 Ftrace 子系统将存储到环形缓冲区中的函数地址和父函数地址将同时通过 stm 设备导出。
目前仅支持 Ftrace “function”跟踪器。