AArch64 Linux 中的活動監視器單元 (AMU) 擴充套件¶
作者:Ionela Voinescu <ionela.voinescu@arm.com>
日期:2019-09-10
本文件簡要描述了 AArch64 Linux 中活動監視器單元的支援。
架構概述¶
活動監視器擴充套件是 ARMv8.4 CPU 架構引入的可選擴充套件。
活動監視器單元實現在每個 CPU 中,提供用於系統管理的效能計數器。 AMU 擴充套件提供了一個系統暫存器介面來訪問計數器暫存器,並且還支援可選的外部記憶體對映介面。
活動監視器架構的第 1 版實現了一個計數器組,該組包含四個固定的、架構定義的 64 位事件計數器。
CPU 週期計數器:以 CPU 的頻率遞增。
常量計數器:以系統時鐘的固定頻率遞增。
已退役指令:每次執行架構指令時遞增。
記憶體停頓週期:計算由時鐘域內最後一級快取中的未命中導致的指令分派停頓週期。
當處於 WFI 或 WFE 狀態時,這些計數器不會遞增。
活動監視器架構為最多 16 個架構事件計數器提供空間。架構的未來版本可能會使用此空間來實現其他架構事件計數器。
此外,第 1 版還實現了一個包含多達 16 個輔助 64 位事件計數器的計數器組。
在冷復位時,所有計數器都會重置為 0。
基本支援¶
核心可以安全地執行混合 CPU,無論是否支援活動監視器擴充套件。 因此,當選擇 CONFIG_ARM64_AMU_EXTN 時,我們會無條件地啟用該功能,以允許任何後來的 CPU(輔助或熱插拔)檢測和使用該功能。
當在 CPU 上檢測到該功能時,我們會標記該功能的可用性,但這並不保證計數器的正確功能,僅保證擴充套件的存在。
韌體(在更高的異常級別執行的程式碼,例如 arm-tf)需要
允許較低的異常級別(EL2 和 EL1)訪問 AMU 暫存器。
啟用計數器。 如果未啟用,這些計數器將讀取為 0。
在 CPU 從“關閉”電源狀態啟動/喚醒之前/之後,儲存/恢復計數器。
當使用啟用此功能的核心但使用損壞的韌體啟動時,使用者在訪問計數器暫存器時可能會遇到崩潰或死鎖。 即使未觀察到這些症狀,暫存器讀取返回的值也可能無法正確反映實際情況。 最常見的是,計數器將讀取為 0,表明它們未啟用。
如果韌體中未提供適當的支援,最好停用 CONFIG_ARM64_AMU_EXTN。 需要注意的是,出於安全原因,這不會繞過將 AMUSERENR_EL0 設定為捕獲從 EL0(使用者空間)到 EL1(核心)的訪問。 因此,韌體仍應確保對 AMU 暫存器的訪問不會在 EL2/EL3 中被捕獲。
AMUv1 的固定計數器可以透過以下系統暫存器定義訪問
SYS_AMEVCNTR0_CORE_EL0
SYS_AMEVCNTR0_CONST_EL0
SYS_AMEVCNTR0_INST_RET_EL0
SYS_AMEVCNTR0_MEM_STALL_EL0
可以使用 SYS_AMEVCNTR1_EL0(n) 訪問輔助平臺特定的計數器,其中 n 是介於 0 和 15 之間的值。
詳細資訊可以在:arch/arm64/include/asm/sysreg.h 中找到。
使用者空間訪問¶
目前,由於以下原因,禁止從使用者空間訪問 AMU 暫存器
安全原因:它們可能會暴露有關以安全模式執行的程式碼的資訊。
目的:AMU 計數器旨在用於系統管理。
此外,使用者空間看不到該功能的存在。
虛擬化¶
目前,由於以下原因,禁止從 KVM 客戶機端的使用者空間 (EL0) 和核心空間 (EL1) 訪問
安全原因:它們可能會暴露有關其他客戶機或主機執行的程式碼的資訊。
任何訪問 AMU 暫存器的嘗試都將導致將 UNDEFINED 異常注入到客戶機中。