xref: /linux/Documentation/translations/zh_CN/arch/arm64/amu.rst (revision e4624435f38b34e7ce827070aa0f8b533a37c07e)
1*e4624435SJonathan Corbet.. include:: ../../disclaimer-zh_CN.rst
2a0eef4a8SBailu Lin
3*e4624435SJonathan Corbet:Original: :ref:`Documentation/arch/arm64/amu.rst <amu_index>`
4a0eef4a8SBailu Lin
5a0eef4a8SBailu LinTranslator: Bailu Lin <bailu.lin@vivo.com>
6a0eef4a8SBailu Lin
7ed159f97SMauro Carvalho Chehab==================================
8a0eef4a8SBailu LinAArch64 Linux 中扩展的活动监控单元
9ed159f97SMauro Carvalho Chehab==================================
10a0eef4a8SBailu Lin
11a0eef4a8SBailu Lin作者: Ionela Voinescu <ionela.voinescu@arm.com>
12a0eef4a8SBailu Lin
13a0eef4a8SBailu Lin日期: 2019-09-10
14a0eef4a8SBailu Lin
15a0eef4a8SBailu Lin本文档简要描述了 AArch64 Linux 支持的活动监控单元的规范。
16a0eef4a8SBailu Lin
17a0eef4a8SBailu Lin
18a0eef4a8SBailu Lin架构总述
19a0eef4a8SBailu Lin--------
20a0eef4a8SBailu Lin
21a0eef4a8SBailu Lin活动监控是 ARMv8.4 CPU 架构引入的一个可选扩展特性。
22a0eef4a8SBailu Lin
23a0eef4a8SBailu Lin活动监控单元(在每个 CPU 中实现)为系统管理提供了性能计数器。既可以通
24a0eef4a8SBailu Lin过系统寄存器的方式访问计数器,同时也支持外部内存映射的方式访问计数器。
25a0eef4a8SBailu Lin
26a0eef4a8SBailu LinAMUv1 架构实现了一个由4个固定的64位事件计数器组成的计数器组。
27a0eef4a8SBailu Lin
28a0eef4a8SBailu Lin  - CPU 周期计数器:同 CPU 的频率增长
29a0eef4a8SBailu Lin  - 常量计数器:同固定的系统时钟频率增长
30a0eef4a8SBailu Lin  - 淘汰指令计数器: 同每次架构指令执行增长
31a0eef4a8SBailu Lin  - 内存停顿周期计数器:计算由在时钟域内的最后一级缓存中未命中而引起
32a0eef4a8SBailu Lin    的指令调度停顿周期数
33a0eef4a8SBailu Lin
34a0eef4a8SBailu Lin当处于 WFI 或者 WFE 状态时,计数器不会增长。
35a0eef4a8SBailu Lin
36a0eef4a8SBailu LinAMU 架构提供了一个高达16位的事件计数器空间,未来新的 AMU 版本中可能
37a0eef4a8SBailu Lin用它来实现新增的事件计数器。
38a0eef4a8SBailu Lin
39a0eef4a8SBailu Lin另外,AMUv1 实现了一个多达16个64位辅助事件计数器的计数器组。
40a0eef4a8SBailu Lin
41a0eef4a8SBailu Lin冷复位时所有的计数器会清零。
42a0eef4a8SBailu Lin
43a0eef4a8SBailu Lin
44a0eef4a8SBailu Lin基本支持
45a0eef4a8SBailu Lin--------
46a0eef4a8SBailu Lin
47a0eef4a8SBailu Lin内核可以安全地运行在支持 AMU 和不支持 AMU 的 CPU 组合中。
48a0eef4a8SBailu Lin因此,当配置 CONFIG_ARM64_AMU_EXTN 后我们无条件使能后续
49a0eef4a8SBailu Lin(secondary or hotplugged) CPU 检测和使用这个特性。
50a0eef4a8SBailu Lin
51a0eef4a8SBailu Lin当在 CPU 上检测到该特性时,我们会标记为特性可用但是不能保证计数器的功能,
52a0eef4a8SBailu Lin仅表明有扩展属性。
53a0eef4a8SBailu Lin
54a0eef4a8SBailu Lin固件(代码运行在高异常级别,例如 arm-tf )需支持以下功能:
55a0eef4a8SBailu Lin
56a0eef4a8SBailu Lin - 提供低异常级别(EL2 和 EL1)访问 AMU 寄存器的能力。
57a0eef4a8SBailu Lin - 使能计数器。如果未使能,它的值应为 0。
58a0eef4a8SBailu Lin - 在从电源关闭状态启动 CPU 前或后保存或者恢复计数器。
59a0eef4a8SBailu Lin
60a0eef4a8SBailu Lin当使用使能了该特性的内核启动但固件损坏时,访问计数器寄存器可能会遭遇
61a0eef4a8SBailu Linpanic 或者死锁。即使未发现这些症状,计数器寄存器返回的数据结果并不一
62a0eef4a8SBailu Lin定能反映真实情况。通常,计数器会返回 0,表明他们未被使能。
63a0eef4a8SBailu Lin
64a0eef4a8SBailu Lin如果固件没有提供适当的支持最好关闭 CONFIG_ARM64_AMU_EXTN。
65a0eef4a8SBailu Lin值得注意的是,出于安全原因,不要绕过 AMUSERRENR_EL0 设置而捕获从
66a0eef4a8SBailu LinEL0(用户空间) 访问 EL1(内核空间)。 因此,固件应该确保访问 AMU寄存器
67a0eef4a8SBailu Lin不会困在 EL2或EL3。
68a0eef4a8SBailu Lin
69a0eef4a8SBailu LinAMUv1 的固定计数器可以通过如下系统寄存器访问:
70a0eef4a8SBailu Lin
71a0eef4a8SBailu Lin - SYS_AMEVCNTR0_CORE_EL0
72a0eef4a8SBailu Lin - SYS_AMEVCNTR0_CONST_EL0
73a0eef4a8SBailu Lin - SYS_AMEVCNTR0_INST_RET_EL0
74a0eef4a8SBailu Lin - SYS_AMEVCNTR0_MEM_STALL_EL0
75a0eef4a8SBailu Lin
76a0eef4a8SBailu Lin特定辅助计数器可以通过 SYS_AMEVCNTR1_EL0(n) 访问,其中n介于0到15。
77a0eef4a8SBailu Lin
78a0eef4a8SBailu Lin详细信息定义在目录:arch/arm64/include/asm/sysreg.h79a0eef4a8SBailu Lin
80a0eef4a8SBailu Lin
81a0eef4a8SBailu Lin用户空间访问
82a0eef4a8SBailu Lin------------
83a0eef4a8SBailu Lin
84a0eef4a8SBailu Lin由于以下原因,当前禁止从用户空间访问 AMU 的寄存器:
85a0eef4a8SBailu Lin
86a0eef4a8SBailu Lin  - 安全因数:可能会暴露处于安全模式执行的代码信息。
87a0eef4a8SBailu Lin  - 意愿:AMU 是用于系统管理的。
88a0eef4a8SBailu Lin
89a0eef4a8SBailu Lin同样,该功能对用户空间不可见。
90a0eef4a8SBailu Lin
91a0eef4a8SBailu Lin
92a0eef4a8SBailu Lin虚拟化
93a0eef4a8SBailu Lin------
94a0eef4a8SBailu Lin
95a0eef4a8SBailu Lin由于以下原因,当前禁止从 KVM 客户端的用户空间(EL0)和内核空间(EL1)
96a0eef4a8SBailu Lin访问 AMU 的寄存器:
97a0eef4a8SBailu Lin
98a0eef4a8SBailu Lin  - 安全因数:可能会暴露给其他客户端或主机端执行的代码信息。
99a0eef4a8SBailu Lin
100a0eef4a8SBailu Lin任何试图访问 AMU 寄存器的行为都会触发一个注册在客户端的未定义异常。
101