分析代码
/* EL2 debug */
mrs x1, id_aa64dfr0_el1
sbfx x0, x1, #ID_AA64DFR0_PMUVER_SHIFT, #4
cmp x0, #1
b.lt 4f // Skip if no PMU present
mrs x0, pmcr_el0 // Disable debug access traps
ubfx x0, x0, #11, #5 // to EL2 and allow access to
4:
csel x3, xzr, x0, lt // all PMU counters from EL1
/* Statistical profiling */
ubfx x0, x1, #ID_AA64DFR0_PMSVER_SHIFT, #4
cbz x0, 7f // Skip if SPE not present
cbnz x2, 6f // VHE?
mrs_s x4, SYS_PMBIDR_EL1 // If SPE available at EL2,
and x4, x4, #(1 << SYS_PMBIDR_EL1_P_SHIFT)
cbnz x4, 5f // then permit sampling of physical
mov x4, #(1 << SYS_PMSCR_EL2_PCT_SHIFT | \
1 << SYS_PMSCR_EL2_PA_SHIFT)
msr_s SYS_PMSCR_EL2, x4 // addresses and physical counter
5:
mov x1, #(MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT)
orr x3, x3, x1 // If we don't have VHE, then
b 7f // use EL1&0 translation.
6: // For VHE, use EL2 translation
orr x3, x3, #MDCR_EL2_TPMS // and disable access from EL1
7:
msr mdcr_el2, x3 // Configure debug traps
分析完毕 ID 的解析部分,我们继续分析调试寄存器的解析
第1行的注释开门见山地解释该段代码与异常等级EL1的调试相关。
id_aa64dfr0_el1
第2行涉及的寄存器 id_aa64dfr0_el1 的含义如下:
ID_AA64DFR0_EL1, AArch64 Debug Feature Register 0
Provides top level information about the debug system in AArch64 state.
该寄存器提供了arm64体系结构EL1异常等级下的调试信息
所以该行代码读取该寄存器的内容并存放到x1寄存器里
第3行代码涉及到如下宏定义
#define ID_AA64DFR0_PMUVER_SHIFT 8
而 sbfx 指令是 ARM64 架构中的一个位字段提取(Signed Bitfield Extract)指令
用于从源寄存器中提取一个指定长度和偏移的位字段,并将该位字段的值(符号扩展后)存入目标寄存器。
所以,该指令的含义是将 id_aa64dfr0_el1 的 位域bits[11:8]经过符号扩展存放到 x0 寄存器中
查找寄存器手册,bits[11:8]的含义如下:
PMUVer, bits [11:8]
Performance Monitors Extension version.
This field does not follow the standard ID scheme,
but uses the Alternative ID scheme described in Alternative ID scheme used for the Performance Monitors Extension version on page D12-2682.
Defined values are:
0b'0000 Performance Monitors Extension not implemented.
0b'0001 Performance Monitors Extension implemented, PMUv3.
0b'0100 PMUv3 for ARMv8.1. As 0b0001, and also includes support for:
•Extended 16-bit PMEVTYPER<n>_EL0.evtCount field.
•If EL2 is implemented, the MDCR_EL2.HPMD control bit.
0b'0101 PMUv3 for ARMv8.4. As 0b0100 and also includes support for the PMMIR_EL1 register.
0b'1111 IMPLEMENTATION DEFINED form of performance monitors supported, PMUv3 not supported. Arm does not recommend this value in new implementations.
第4行的含义是上述位域bits[11:8]与立即数1进行比较,如果位域bits[11:8]的值小于1, 我的理解就是位域的值为 0b'0000 或者 0b'1111 的时候,表示不支持 PMU,直接跳转到第8行
根据位域bits[11:8]的表述,0b'0000 表示 在该体系架构中,PMU没有实现;
0b'1111 则表示该ARM64实现支持一种由具体实现定义的性能监视器形式。不同的ARM处理器实现(如不同的核心型号、不同的制造商等)可能会有不同的性能监视器实现。这些实现可能不完全遵循ARM架构规范中定义的通用性能监视器接口(如PMUv3),而是采用了特定的、自定义的设计。
由于有两个值表示系统没有使用标准PMU,所以位提取指令采用sbfx而不是ubfx。
PMCR_EL0
第6行涉及到寄存器 pmcr_el0, 该寄存器的含义如下:
PMCR_EL0, Performance Monitors Control Register
Provides details of the Performance Monitors implementation, including the number of counters implemented, and configures and controls the counters.
在ARM64架构中,PMCR_EL0寄存器是性能监视控制寄存器(Performance Monitors Control Register)的一部分,
它位于EL0(非特权模式)级别。这个寄存器用于控制性能监视单元(Performance Monitor Unit, PMU)的行为,
允许在软件层面开启或关闭性能监视功能,以及配置其他与性能监视相关的参数。
PMCR_EL0寄存器的功能主要包括:
控制性能监视的启用和禁用:通过修改PMCR_EL0寄存器中的相应位,可以启用或禁用性能监视功能。这对于控制性能监视对系统性能的影响以及管理监视数据的收集至关重要;
配置性能监视事件:虽然PMCR_EL0寄存器本身可能不直接配置监视事件,但它可能与其他性能监视相关的寄存器一起工作,以控制哪些事件被监视以及监视的方式;
监视状态控制:PMCR_EL0寄存器还可能包含控制监视状态(如复位监视器、清除溢出标志等)的位;
第7行的含义是提取该寄存器的位域bits[15:11], 并存放在x0寄存器里,该位域的含义如下:
N, bits [15:11]
An RO field that indicates the number of event counters implemented. This value is in the range of 0b00000-0b111111.
If the value is 0b00000 then only PMCCNTR_EL0 is implemented.
If the value is 0b111111 PMCCNTR_EL0 and 31 event counters are implemented.
When EL2 is implemented and enabled for the current Security state, reads of this field from EL1 and EL0 return the value of MDCR_EL2.HPMN.
详细解释如下:
性能监控控制寄存器(PMCR_EL0)的位域 N(位于位 [15:11])用于指示处理器实现的事件计数器数量。以下是该位域的详细解释:
位域 N [15:11] 的含义
功能:只读字段,指示处理器中实现的可编程事件计数器(Performance Event Counters)的数量。
取值范围:0b00000 到 0b11111(二进制),对应十进制值 0 到 31。
硬件实现规则:
- N = 0b00000(十进制 0):表示只实现了 PMCCNTR_EL0(周期计数器,记录处理器周期数),没有额外的事件计数器。
- N = 0b11111(十进制 31):表示实现了 PMCCNTR_EL0 和 31 个可编程事件计数器(PMCNTR0 - PMCNTR31)。
事件计数器的作用
事件计数器用于监控处理器的各种性能指标,例如:
- PMCCNTR_EL0:记录处理器执行的总周期数。
- PMCNTR0-PMCNTR31:可配置为统计特定事件(如指令缓存命中、数据缓存缺失、分支预测错误等)的发生次数。
特殊情况:EL2(Hypervisor)的影响
当系统启用 EL2(Hypervisor) 且当前安全状态允许时,从 EL1(操作系统) 或 EL0(用户空间) 读取该位域时,返回的值由 MDCR_EL2.HPMN 决定。
- MDCR_EL2.HPMN:是 EL2 层的一个控制位,用于限制较低特权级(EL1/EL0)可见的事件计数器数量。
- 这种机制允许 Hypervisor 向操作系统或用户空间暴露部分计数器,实现性能监控的隔离或虚拟化。
示例说明
-
读取 N 的值:
assembly
MRS X0, PMCR_EL0 ; 将 PMCR_EL0 的值读入 X0 AND X0, X0, #0x0000F800 ; 掩码提取位[15:11](N的值) UBFX X0, X0, #11, #5 ; 无符号右移11位,得到N的数值(0-31) -
根据 N 值判断计数器数量:
- 若
N = 0,则只有 PMCCNTR_EL0 可用。 - 若
N = 10,则 PMCCNTR_EL0 和 PMCNTR0-PMCNTR10 可用(共 11 个计数器)。
- 若
注意事项
- 硬件依赖性:实际实现的计数器数量由芯片厂商决定,N 的值需通过读取寄存器动态确定,不能假设固定值。
- 特权级限制:在 EL2 启用时,EL1/EL0 看到的 N 值可能被 Hypervisor 改写,需结合 MDCR_EL2.HPMN 理解。
- 编程建议:在使用性能计数器前,应先读取 PMCR_EL0.N 确定可用计数器的数量,避免访问不存在的计数器导致错误。
关于计数器的解释,请看文章末尾的篇外篇
第9行的含义使用csel指令,在ARM64架构中,csel(Conditional Select)指令是一种条件选择指令,用于根据条件码(Condition Flags)的结果来选择两个源操作数中的一个,并将结果存储到目标寄存器中。csel指令非常适合在条件分支之后使用,以避免分支的延迟和开销。
因此,csel x3, xzr, x0, lt 这条指令的含义是:如果最近一次算术或比较指令的结果表明某个值(这里不直接指定,因为lt条件是基于之前指令的隐式结果)小于另一个值(同样,这个比较也是隐式的,lt只关心条件是否满足),则将x0的值复制到x3中;如果条件不满足(即不小于),则将xzr(0)的值复制到x3中。
第12行, ID_AA64DFR0_PMSVER_SHIFT的定义如下
#define ID_AA64DFR0_PMSVER_SHIFT 32
寄存器 id_aa64dfr0_el1 位域bits[35:32]的含义如下:
PMSVer, bits [35:32]
From ARMv8.2:
Statistical Profiling Extension version. The defined values of this field are:
0b0000 Statistical Profiling Extension not implemented.
0b0001 Statistical Profiling Extension implemented.
SVE on page A1-75 implements the functionality added by the value 0b0001.
All other values are reserved.
含义如下:
在 ARMv8.2 架构中,ID_AA64DFR0_EL1寄存器的PMSVer位域(位 [35:32])用于指示 统计分析扩展(Statistical Profiling Extension) 的实现状态。这个扩展提供了对处理器性能和功耗进行统计分析的功能。
位域定义解析
位置:ID_AA64DFR0_EL1寄存器的第 32 至 35 位(从 LSB=0 开始计数)。
值含义:
0b0000:统计分析扩展未实现。读取该位域会返回 0。
0b0001:统计分析扩展已实现。此时,系统支持:
收集指令和数据访问的统计信息(如缓存命中率、分支预测准确率)。
监控特定事件的发生频率(如 TLB 缺失、CPU 周期)。
0b0010至0b1111:保留值。若读取到这些值,可能表示硬件异常或架构扩展。
第13行的含义是,如果该寄存器位0,则跳转到第28行,也就是说如果不支持PMVer,也没有必要进行统计分析相关的调测配置
第14行的含义是,如果x2寄存器的值非0,由于x2始终保留当前CPU core是否支持VHE的值,也就是说,如果不支持VHE,则跳转到第26行。
PMBIDR_EL1
第15行的含义是,读取系统寄存器 PMBIDR_EL1 的值并存放到x4寄存器中,系统寄存器 PMBIDR_EL1 的含义如下:
PMBIDR_EL1, Profiling Buffer ID Register
Provides information to software as to whether the buffer can be programmed at the current Exception level.
这个寄存器位于EL1异常级别,Profiling Buffer是ARM架构中用于性能分析的一种硬件机制,它能够捕获和存储有关指令执行的详细信息,比如指令地址、取指、执行和存储访问等事件。
这些信息可以用于性能分析,帮助开发者理解和优化程序的执行路径和性能瓶颈。
系统软件可以读取该寄存器的内容并解析,当前异常级别也就是EL1异常级别下,是否可以配置调试缓冲。
第16行 SYS_PMBIDR_EL1_P_SHIFT的含义如下:
#define SYS_PMBIDR_EL1_P_SHIFT 4
P, bit [4]
Programming not allowed. The Profiling Buffer is owned by a higher Exception level or the other Security state.
0b'0 Profiling Buffer is owned by the current or a lower Exception level in the current Security state.
0b'1 Profiling Buffer is owned by a higher Exception level or the other Security state.
也就是说,如果该配置为0,则调试EL0/EL1拥有该调试缓冲;如果该配置为1,则EL2/EL3获取其他的安全模式下拥有该调试缓冲。
第17行的含义就是,如果bit[4]为1,则跳转到第22行。
第18行,第19行的宏定义如下:
#define SYS_PMSCR_EL2_PA_SHIFT 4
#define SYS_PMSCR_EL2_PCT_SHIFT 6
PMSCR_EL2
第20行 PMSCR_EL2, Statistical Profiling Control Register (EL2)寄存器的含义如下:
Provides EL2 controls for Statistical Profiling
这是一个特定于高级异常级别(EL2)的寄存器,用于控制统计分析功能。统计分析是一种性能分析技术,可以收集程序运行时的统计信息,如指令执行次数、缓存命中率、分支预测情况等,以帮助开发者优化程序性能。
PMSCR_EL2寄存器包含多个功能位,用于控制不同的统计分析功能。例如,可能有位用于启用或禁用统计分析、设置采样率、选择统计数据的收集方式等。
我们想要使能的bit位如下:
PCT, bit [6]
Physical Timestamp.
If timestamp sampling is enabled, determines which counter is collected.
0b'0 Virtual counter, CNTVCT_EL0, is collected.
0b'1 Physical counter, CNTPCT_EL0, is collected.
PA, bit [4]
Physical Address Sample Enable.
0b'0 Physical addresses are not collected.
0b'1 Physical addresses are collected.
MDCR_EL2
E2PB
芯片资料解释
第22行的宏定义如下:
#define MDCR_EL2_E2PB_MASK (UL(0x3))
#define MDCR_EL2_E2PB_SHIFT (UL(12))
根据宏定义的名称,应该涉及到系统寄存器 MDCR_EL2, Monitor Debug Configuration Register (EL2),其含义如下:
Provides EL2 configuration options for self-hosted debug and the Performance Monitors Extension
对应的位域bits[13:12]定义如下:
E2PB, bits [13:12]
From ARMv8.2:
EL2 Profiling Buffer. When the Statistical Profiling Extension is implemented,
this field controls the owning translation regime and access to Profiling Buffer control registers from EL1.
0b'00 Profiling Buffer uses the EL2 stage 1 translation regime. Accesses to Profiling Buffer controls at EL1 generate a Trap exception to EL2 when it is enabled in the current Security state.
0b'10 Profiling Buffer uses the EL1&0 stage 1 translation regime. Accesses to Profiling Buffer controls at EL1 generate a Trap exception to EL2 when it is enabled in the current Security state.
0b'11Profiling Buffer uses the EL1&0 stage 1 translation regime. Accesses to Profiling Buffer controls at EL1 are not trapped.
含义如下:
MDCR_EL2(Monitor Debug Configuration Register for EL2)中的E2PB位域(bits[13:12])是用于控制统计性能分析扩展(Statistical Profiling Extension, SPE)的分析缓冲区(Profiling Buffer)的归属和访问权限的配置选项。以下是其具体含义:
E2PB(EL2 Profiling Buffer)功能说明
-
作用
-
当实现了统计性能分析扩展(SPE)时,E2PB 控制:
-
Profiling Buffer 使用的地址转换机制(translation regime)(即 EL2 还是 EL1&0 的 stage 1 页表)。
-
是否允许 EL1 直接访问 Profiling Buffer 控制寄存器,还是会被 Trap 到 EL2。
-
-
-
E2PB 的取值及含义
-
0b00:
-
Profiling Buffer 使用 EL2 的 stage 1 地址转换机制(即由 EL2 的页表管理)。
-
EL1 访问 Profiling Buffer 控制寄存器时会被 Trap 到 EL2(如果当前安全状态下启用了该功能)。
-
-
0b10:
-
Profiling Buffer 使用 EL1&0 的 stage 1 地址转换机制(即由 EL1 的页表管理)。
-
EL1 访问 Profiling Buffer 控制寄存器时会被 Trap 到 EL2(如果当前安全状态下启用了该功能)。
-
-
0b11:
-
Profiling Buffer 使用 EL1&0 的 stage 1 地址转换机制(由 EL1 页表管理)。
-
EL1 访问 Profiling Buffer 控制寄存器时不会被 Trap(允许直接访问)。
-
-
典型应用场景
-
虚拟化环境(Hypervisor 管理):
-
如果 Hypervisor(EL2)希望完全控制 Profiling Buffer,可以选择 0b00,这样 EL1 的访问会被 Trap 到 EL2。
-
如果 Hypervisor 希望 Guest OS(EL1)能管理 Profiling Buffer,可以选择 0b10(受控访问)或 0b11(完全放权)。
-
-
性能监控与调试:
-
该配置影响 SPE 的数据采集方式,特别是在虚拟化环境中,需要根据需求选择合适的地址转换和访问权限。
-
总结
E2PB 位主要用于控制 Profiling Buffer 的归属(EL2 还是 EL1)以及 EL1 访问是否会被 Trap 到 EL2,适用于 ARMv8.2 及更高版本的处理器。
第23行就是时能寄存器 MDCR_EL2 的位域bits[13:12]为0b'11
第26行 MDCR_EL2_TPMS 的宏定义如下:
#define MDCR_EL2_TPMS (1 << 14)
TPMS
芯片资料解释
TPMS, bit [14]
From ARMv8.2:
Trap Performance Monitor Sampling. When the Statistical Profiling Extension is implemented, this field controls access to Statistical Profiling control registers from EL1.
0b'0 Do not trap Statistical Profiling controls to EL2.
0b'1 Accesses to Statistical Profiling controls at EL1 generate a Trap exception to EL2 when it is enabled in the current Security state.
赋值为1表示EL1不能直接访问Statistical Profiling controls,只能陷入到更高的异常等级EL2访问
第28行表示操作完 bits[14:12],也就是这些bits位域都设为0b'1后,回写到 MDCR_EL2 寄存器中
功能概述
-
TPMS(Trap Performance Monitor Sampling) 是 MDCR_EL2(Monitor Debug Configuration Register for EL2) 的一个控制位,用于管理 统计性能分析扩展(Statistical Profiling Extension, SPE) 相关寄存器的访问权限。
-
当 SPE 被实现(ARMv8.2 及更高版本) 时,TPMS 决定 EL1(Guest OS 或应用层) 访问 SPE 控制寄存器时是否会被 Trap(捕获)到 EL2(Hypervisor)。
TPMS 的取值及含义
| 值(bit[14]) | 含义 |
|---|---|
| 0b0 | 不 Trap(允许 EL1 直接访问 SPE 控制寄存器) • EL1 可以直接读写 SPE 相关控制寄存器(如 PMSCR_EL1 等),不会被 EL2 拦截。 |
| 0b1 | Trap 到 EL2(EL1 访问 SPE 控制寄存器时触发异常) • 当 EL1 尝试访问 SPE 控制寄存器时,会触发 Trap 异常(交由 EL2 处理)。 • 仅在当前安全状态(Secure/Non-secure)下启用该功能时生效。 |
典型应用场景
-
虚拟化环境(Hypervisor 管理 SPE)
-
TPMS = 1(Trap 到 EL2):
-
Hypervisor(EL2)可以 监控或限制 Guest OS(EL1)对 SPE 的使用,防止恶意或错误的配置影响系统性能或安全性。
-
例如,Hypervisor 可以记录或审计 Guest OS 的性能监控行为。
-
-
TPMS = 0(不 Trap):
-
允许 Guest OS(EL1)直接配置 SPE,适用于 受信任的虚拟机 或 非虚拟化环境。
-
-
-
调试与性能分析
-
在 裸机调试 或 性能优化 时,可以设置
TPMS=0,让 OS(EL1)直接控制 SPE,方便采集性能数据。 -
在 安全敏感环境 中,可以设置
TPMS=1,确保只有 Hypervisor(EL2)能管理 SPE,防止未授权的性能监控。
-
与其他相关寄存器/位的关联
-
E2PB(bits[13:12]):
-
控制 Profiling Buffer 的地址转换机制(EL2 或 EL1&0) 和 EL1 访问是否 Trap。
-
如果
E2PB=0b00或0b10,即使TPMS=0,EL1 访问某些 SPE 寄存器仍可能被 Trap(取决于 E2PB 的配置)。
-
-
MDCR_EL2.TPM(bit[5]):
-
控制 通用性能监控(PMU)寄存器 的 Trap 行为(非 SPE 相关),而
TPMS仅针对 SPE 专用寄存器。
-
总结
-
TPMS = 0 → EL1 可直接访问 SPE 控制寄存器(适用于非虚拟化或受信环境)。
-
TPMS = 1 → EL1 访问 SPE 控制寄存器时 Trap 到 EL2(适用于虚拟化或安全敏感场景)。
-
该功能需 ARMv8.2+ 且支持 SPE,通常由 Hypervisor 或系统固件配置
篇外篇
可编程计数器
在 ARM64 架构中,可编程事件计数器(Programmable Event Counters) 是性能监控单元(PMU,Performance Monitoring Unit)的核心组件,用于实时跟踪和统计处理器内部发生的各类硬件事件。其核心作用是帮助软件(如性能分析工具、操作系统、调试器等)量化系统运行状态,定位性能瓶颈,优化程序效率。
主要作用与功能
可编程事件计数器的核心价值在于对处理器内部事件进行精确计数,这些事件涵盖了从指令执行、缓存行为到总线交互等多个维度。具体作用如下:
-
监控硬件事件的发生次数
计数器可被配置为统计特定硬件事件的发生次数,例如:- 指令相关:指令执行总数、分支指令数、分支预测错误数。
- 缓存行为:L1/L2 缓存命中数、缓存缺失数、缓存行填充次数。
- 内存访问:加载 / 存储指令数、TLB( Translation Lookaside Buffer)命中 / 缺失数。
- 总线活动:外部总线访问次数、总线冲突次数。
- 异常与中断:中断请求数、异常处理次数。
例如,通过统计 “L1 数据缓存缺失数”,可以判断程序是否因频繁缓存失效导致性能下降,进而优化数据访问模式。
-
支持性能分析与瓶颈定位
软件可通过配置不同的计数器监控多个事件,结合事件之间的关联性分析系统瓶颈:- 对比 “指令执行数” 与 “周期数”,计算 CPI(每指令周期数),评估指令流水线效率。
- 结合 “分支预测错误数” 与 “分支指令数”,判断分支预测器的有效性,指导代码优化(如减少无条件分支)。
- 跟踪 “内存访问数” 与 “缓存缺失数”,定位内存访问密集型代码,优化数据局部性。
-
实现性能调试与优化
开发者可通过编程控制计数器的启动、停止、重置,针对性地监控特定代码段的行为:- 例如,在程序的关键函数前后启动 / 停止计数器,获取该函数执行期间的事件数据(如耗时周期、缓存缺失次数),定位优化点。
- 操作系统可利用计数器监控进程 / 线程的资源消耗,实现动态调度(如将频繁缓存失效的进程调度到缓存性能更好的核心)。
-
支持系统级性能监控
操作系统或虚拟化层(如 Hypervisor)可通过计数器监控全局系统状态:- 跟踪 CPU 利用率、内存带宽占用等宏观指标,进行资源分配优化。
- 在虚拟化场景中,通过限制客户机对计数器的访问(如 EL2 层的 MDCR_EL2 寄存器控制),实现不同虚拟机的性能隔离。
与固定功能计数器的区别
ARM64 的 PMU 中,除了可编程事件计数器,还有一个固定功能计数器(PMCCNTR_EL0),二者的区别在于:
- 固定功能计数器(PMCCNTR_EL0):只能统计处理器的总时钟周期数(如 CPU 运行的总滴答数),功能单一,不可配置。
- 可编程事件计数器:可通过编程选择监控的事件类型(如缓存缺失、分支错误等),灵活性高,数量由 PMCR_EL0.N 位域决定(最多 31 个)。
典型应用场景
- 程序性能优化:开发者使用工具(如
perf)通过计数器分析代码热点,例如:- 若 “缓存缺失率” 过高,可优化数据结构(如数组替代链表)以提高缓存利用率。
- 系统调优:运维人员通过计数器监控服务器状态,例如:
- 若 “总线冲突次数” 激增,可能是内存带宽瓶颈,需升级硬件或调整进程优先级。
- 故障排查:通过异常事件计数(如 “TLB 缺失过多”)定位内存管理问题(如页表配置不合理)。
总结
可编程事件计数器是硬件提供的 “性能探针”,通过精确量化处理器内部行为,为软件优化、系统调优和故障排查提供客观数据支撑。其可编程性使其能够适应不同场景的监控需求,是现代处理器性能分析的核心工具。
ID_AA64DFR0_EL1位 [35:32] (PMSVer) 和 id_aa64dfr0_el1 位 [11:8] (PMUVers)区别
对比项 ID_AA64DFR0_EL1位 [35:32] (PMSVer) id_aa64dfr0_el1 位 [11:8] (PMUVers)
功能 统计分析扩展(Statistical Profiling) 性能监控单元(PMU)
数据类型 二进制标志(是否支持) 版本号(指示功能演进)
主要用途 收集统计数据(如缓存命中率分布) 计数特定事件(如指令数、周期数)
架构依赖 ARMv8.2+ ARMv8.0+
典型应用 编译器优化、工作负载特征分析 性能调优、瓶颈检测
总结
这段代码是 ARM64 Linux 内核中设置调试和性能监控相关功能的汇编代码,主要涉及 EL2 (Hypervisor) 级别的调试配置。以下是详细分析:
-
目的:
-
配置 EL2 的调试和性能监控单元(PMU)相关设置
-
设置统计性能分析(SPE)的相关权限
-
控制不同异常级别(EL1/EL2)对调试功能的访问权限
-
代码功能分解:
PMU 配置部分:
-
读取 ID_AA64DFR0_EL1 寄存器检查 PMU 版本
-
如果 PMU 存在(版本≥1),读取 PMCR_EL0 并提取计数器数量
-
最终结果存储在 x3 中(不存在则置0)
统计性能分析(SPE)配置:
-
检查 SPE 是否可用
-
非 VHE 模式时:
-
检查 PMBIDR_EL1.P 位判断是否支持物理地址采样
-
设置 PMSCR_EL2 寄存器允许物理地址和计数器采样
-
-
设置 MDCR_EL2.E2PB 控制 SPE 缓冲区转换
-
VHE 模式时:
-
设置 MDCR_EL2.TPMS 禁止 EL1 访问分析功能
-
-
-
关键寄存器:
-
MDCR_EL2(Monitor Debug Configuration Register):主控制寄存器,配置各种调试陷阱 -
PMCR_EL0:性能监控控制寄存器 -
PMBIDR_EL1:性能监控缓冲区标识寄存器 -
PMSCR_EL2:统计性能分析控制寄存器
-
-
用途:
-
为虚拟化环境正确配置性能监控和调试功能
-
控制 guest OS(EL1)对性能监控资源的访问
-
启用/禁用特定调试功能以防止信息泄露或保证安全性
-
在虚拟化环境中支持性能分析工具的使用
-
这段代码通常在系统初始化阶段执行,确保在进入操作系统前正确设置所有调试和性能监控相关的硬件功能,特别是在虚拟化环境中这些设置对隔离性和安全性至关重要。
1665



被折叠的 条评论
为什么被折叠?



