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 異常注入到客戶機中。