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