系統跟蹤模組¶
系統跟蹤模組 (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”跟蹤器。