1. Arm Neoverse V2 PMU架构概述
性能监控单元(PMU)是现代处理器中用于硬件性能分析的核心模块,它通过一组可编程的事件计数器来采集处理器内部的各类性能指标。Arm Neoverse V2作为面向基础设施的高性能核心,其PMU设计在兼容Armv8架构的基础上进行了多项增强。
1.1 PMU基本组成
Neoverse V2的PMU主要由以下组件构成:
- 1个64位周期计数器(PMCCNTR_EL0):用于统计处理器时钟周期
- 30个64位事件计数器(PMEVCNTRn_EL0):可配置监控不同硬件事件
- 事件类型寄存器(PMEVTYPERn_EL0):配置各事件计数器的监控行为
- 控制寄存器(PMCR_EL0):全局控制与状态管理
- 多个快照寄存器(PMPCSSR等):用于捕获瞬时状态
其中事件计数器的数量在不同Arm实现中可能有所变化,Neoverse V2提供了30个通用事件计数器,这在服务器级工作负载中提供了足够的监控粒度。
1.2 权限与安全模型
Arm PMU的一个关键特性是其精细的权限控制系统,这主要体现在:
- 特权级过滤:通过P(Privileged)和U(User)位控制EL1和EL0的计数
- 安全状态过滤:通过NSK(Non-secure Kernel)、NSU(Non-secure User)等位控制安全与非安全状态的计数
- 访问控制:需要满足!DoubleLockStatus() && !OSLockStatus()等条件才能配置PMU
这种设计使得在虚拟化环境和容器化场景中,可以确保:
- 虚拟机监控程序能隔离各VM的性能数据
- 容器运行时可以控制容器的PMU访问权限
- 防止非特权用户获取敏感的性能侧信道信息
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. PMEVTYPER寄存器详解
PMEVTYPERn_EL0寄存器是配置事件计数器的核心接口,每个事件计数器都有一个对应的PMEVTYPER寄存器。以PMEVTYPER2_EL0为例,其寄存器布局如下:
2.1 寄存器位域解析
code复制63 32 31 30 29 28 27 26 25 24 23 16 15 10 9 0
+------------------+--+--+--+--+--+--+--+--+---------+---------+----------+
| RES0 |P |U |NS|NS|NS|M |RE|SH| RES0 |evtCount | evtCount |
| | | |K |U |H | |S0| | |[15:10] | [9:0] |
+------------------+--+--+--+--+--+--+--+--+---------+---------+----------+
各关键字段的功能如下:
2.1.1 特权级过滤位
- P(bit31):特权模式过滤
- 0:计数EL1事件
- 1:不计数EL1事件
- U(bit30):用户模式过滤
- 0:计数EL0事件
- 1:不计数EL0事件
2.1.2 安全状态过滤位
- NSK(bit29):非安全EL1过滤
- 当NSK == P时计数非安全EL1事件
- NSU(bit28):非安全EL0过滤
- 当NSU == U时计数非安全EL0事件
- NSH(bit27):EL2过滤
- 0:不计数EL2事件
- 1:计数EL2事件
- M(bit26):EL3过滤
- 当M == P时计数EL3事件
- SH(bit24):安全EL2过滤
- 当SH != NSH时计数安全EL2事件
2.1.3 事件选择字段
- evtCount[15:0]:16位事件编号,其中:
- evtCount[9:0]:基本事件编号
- evtCount[15:10]:事件编号扩展
2.2 典型配置示例
示例1:监控用户态L1数据缓存访问
c复制// 配置计数器2监控EL0的L1数据缓存访问
PMEVTYPER2_EL0 = (0x0 << 31) | // P=0 (不限制EL1)
(0x0 << 30) | // U=0 (允许EL0)
(0x0 << 29) | // NSK=0
(0x0 << 28) | // NSU=0
(0x1 << 27) | // NSH=1 (允许EL2)
(0x0 << 26) | // M=0
(0x0 << 24) | // SH=0
(0x40); // L1D_CACHE_ACCESS事件
示例2:监控内核态分支预测失败
c复制// 配置计数器3监控EL1的分支预测失败
PMEVTYPER3_EL0 = (0x0 << 31) | // P=0 (允许EL1)
(0x1 << 30) | // U=1 (禁止EL0)
(0x0 << 29) | // NSK=0
(0x1 << 28) | // NSU=1
(0x1 << 27) | // NSH=1
(0x0 << 26) | // M=0
(0x0 << 24) | // SH=0
(0x08); // BR_PRED_FAIL事件
2.3 事件编号空间
Arm架构定义了标准的事件编号空间,主要分为以下几类:
|
