慢慢欣赏arm64内核启动7 primary_entry之el2_setup代码第五部分

ARMv8汇编器参考指南 DS-5当中集成的ARM asm汇编器,包括汇编器的命令选项,包括ARMv8 64位架构之下A32,T32,A64的各种指令的介绍,包括汇编语言的写法说明,包括ARMv8 ARM64架构下的SIMD指令说明。 立即下载

分析代码

	/* 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 向操作系统或用户空间暴露部分计数器,实现性能监控的隔离或虚拟化。

示例说明

  1. 读取 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)
    
  2. 根据 N 值判断计数器数量:

    • 若 N = 0,则只有 PMCCNTR_EL0 可用。
    • 若 N = 10,则 PMCCNTR_EL0 和 PMCNTR0-PMCNTR10 可用(共 11 个计数器)。

注意事项

  1. 硬件依赖性:实际实现的计数器数量由芯片厂商决定,N 的值需通过读取寄存器动态确定,不能假设固定值。
  2. 特权级限制:在 EL2 启用时,EL1/EL0 看到的 N 值可能被 Hypervisor 改写,需结合 MDCR_EL2.HPMN 理解。
  3. 编程建议:在使用性能计数器前,应先读取 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)功能说明
  1. 作用

    • 当实现了统计性能分析扩展(SPE)时,E2PB 控制:

      • Profiling Buffer 使用的地址转换机制(translation regime)(即 EL2 还是 EL1&0 的 stage 1 页表)。

      • 是否允许 EL1 直接访问 Profiling Buffer 控制寄存器,还是会被 Trap 到 EL2。

  2. 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 拦截。
0b1Trap 到 EL2(EL1 访问 SPE 控制寄存器时触发异常)
• 当 EL1 尝试访问 SPE 控制寄存器时,会触发 Trap 异常(交由 EL2 处理)。
• 仅在当前安全状态(Secure/Non-secure)下启用该功能时生效。

典型应用场景
  1. 虚拟化环境(Hypervisor 管理 SPE)

    • TPMS = 1(Trap 到 EL2):

      • Hypervisor(EL2)可以 监控或限制 Guest OS(EL1)对 SPE 的使用,防止恶意或错误的配置影响系统性能或安全性。

      • 例如,Hypervisor 可以记录或审计 Guest OS 的性能监控行为。

    • TPMS = 0(不 Trap):

      • 允许 Guest OS(EL1)直接配置 SPE,适用于 受信任的虚拟机 或 非虚拟化环境。

  2. 调试与性能分析

    • 在 裸机调试 或 性能优化 时,可以设置 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)的核心组件,用于实时跟踪和统计处理器内部发生的各类硬件事件。其核心作用是帮助软件(如性能分析工具、操作系统、调试器等)量化系统运行状态,定位性能瓶颈,优化程序效率。

主要作用与功能

可编程事件计数器的核心价值在于对处理器内部事件进行精确计数,这些事件涵盖了从指令执行、缓存行为到总线交互等多个维度。具体作用如下:

  1. 监控硬件事件的发生次数
    计数器可被配置为统计特定硬件事件的发生次数,例如:

    • 指令相关:指令执行总数、分支指令数、分支预测错误数。
    • 缓存行为:L1/L2 缓存命中数、缓存缺失数、缓存行填充次数。
    • 内存访问:加载 / 存储指令数、TLB( Translation Lookaside Buffer)命中 / 缺失数。
    • 总线活动:外部总线访问次数、总线冲突次数。
    • 异常与中断:中断请求数、异常处理次数。

    例如,通过统计 “L1 数据缓存缺失数”,可以判断程序是否因频繁缓存失效导致性能下降,进而优化数据访问模式。

  2. 支持性能分析与瓶颈定位
    软件可通过配置不同的计数器监控多个事件,结合事件之间的关联性分析系统瓶颈:

    • 对比 “指令执行数” 与 “周期数”,计算 CPI(每指令周期数),评估指令流水线效率。
    • 结合 “分支预测错误数” 与 “分支指令数”,判断分支预测器的有效性,指导代码优化(如减少无条件分支)。
    • 跟踪 “内存访问数” 与 “缓存缺失数”,定位内存访问密集型代码,优化数据局部性。
  3. 实现性能调试与优化
    开发者可通过编程控制计数器的启动、停止、重置,针对性地监控特定代码段的行为:

    • 例如,在程序的关键函数前后启动 / 停止计数器,获取该函数执行期间的事件数据(如耗时周期、缓存缺失次数),定位优化点。
    • 操作系统可利用计数器监控进程 / 线程的资源消耗,实现动态调度(如将频繁缓存失效的进程调度到缓存性能更好的核心)。
  4. 支持系统级性能监控
    操作系统或虚拟化层(如 Hypervisor)可通过计数器监控全局系统状态:

    • 跟踪 CPU 利用率、内存带宽占用等宏观指标,进行资源分配优化。
    • 在虚拟化场景中,通过限制客户机对计数器的访问(如 EL2 层的 MDCR_EL2 寄存器控制),实现不同虚拟机的性能隔离。

与固定功能计数器的区别

ARM64 的 PMU 中,除了可编程事件计数器,还有一个固定功能计数器(PMCCNTR_EL0),二者的区别在于:

  • 固定功能计数器(PMCCNTR_EL0):只能统计处理器的总时钟周期数(如 CPU 运行的总滴答数),功能单一,不可配置。
  • 可编程事件计数器:可通过编程选择监控的事件类型(如缓存缺失、分支错误等),灵活性高,数量由 PMCR_EL0.N 位域决定(最多 31 个)。

典型应用场景

  1. 程序性能优化:开发者使用工具(如perf)通过计数器分析代码热点,例如:
    • 若 “缓存缺失率” 过高,可优化数据结构(如数组替代链表)以提高缓存利用率。
  2. 系统调优:运维人员通过计数器监控服务器状态,例如:
    • 若 “总线冲突次数” 激增,可能是内存带宽瓶颈,需升级硬件或调整进程优先级。
  3. 故障排查:通过异常事件计数(如 “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) 级别的调试配置。以下是详细分析:

  1. 目的:

  • 配置 EL2 的调试和性能监控单元(PMU)相关设置

  • 设置统计性能分析(SPE)的相关权限

  • 控制不同异常级别(EL1/EL2)对调试功能的访问权限

  1. 代码功能分解:

    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 访问分析功能

  2. 关键寄存器:

    • MDCR_EL2 (Monitor Debug Configuration Register):主控制寄存器,配置各种调试陷阱

    • PMCR_EL0:性能监控控制寄存器

    • PMBIDR_EL1:性能监控缓冲区标识寄存器

    • PMSCR_EL2:统计性能分析控制寄存器

  3. 用途:

    • 为虚拟化环境正确配置性能监控和调试功能

    • 控制 guest OS(EL1)对性能监控资源的访问

    • 启用/禁用特定调试功能以防止信息泄露或保证安全性

    • 在虚拟化环境中支持性能分析工具的使用

这段代码通常在系统初始化阶段执行,确保在进入操作系统前正确设置所有调试和性能监控相关的硬件功能,特别是在虚拟化环境中这些设置对隔离性和安全性至关重要。

05-SA8155 QNX Display框架及代码分析(1) 显示是非常重要的一个模块,人机交互的桥梁。那么SA8155 Hypervisor显示是如何处理的呢。对处理流程非常的好奇O(∩_∩)O哈哈~。TODO。 阅读详情

相关推荐

DCDC BUCK开关电源PCB设计

在开关电源中,BUCK(降压)电路、BOOST(升压)电路以及BUCK - BOOST(升降压)三种电路是最基本的拓扑结构。转换器又分DCDC(直流转直流)和ACDC(交流转直流),DCDC装换器结构无疑是比ACDC转换器结构简单,所以从DCDC转换器结构入手学习开关电源是一种很好的选择。本文主要从应用角度,进行相关器件的选型计算以及PCB绘制讲解DCDC 12V转5Vbuck电路。

2301_78342510的博客 6884

perf_event框架之:ARM PMU硬件

这几个寄存器的bit field分布都相同,如上图所示,分别用来配置PMU counter中断的使能和关闭,以及检查PMU counter的溢出状态。许多体系结构都包含PMU(Performance Monitoring Unit)硬件,用于跟踪、计数系统内部的一些底层硬件事件,如与CPU有关的事件(执行指令数、捕获异常数、时钟周期数等)、与cache有关的事件(data/inst./L1/L2 cache访问次数,miss次数等)以及与TLB有关的事件等。(二)用于配置计数事件的寄存器。

nihao_2014的博客 1943

从AAAI 2025被拒到ACM MM 2025录用:我的论文投稿经验与教训总结

本文分享了作者从AAAI 2025被拒到ACM MM 2025录用的论文投稿经验与教训。详细解析了格式要求、可复现性清单等关键细节,提供了精准转投策略和提升录用概率的实用技巧,帮助研究者避免常见错误并优化投稿策略。

weixin_29207533的博客 505

ARM64体系结构编程3-算数和移位指令

b 指令的操作由后缀 cs 决定,cs 表示判断是否发生无符号溢出,3 + not(2) + 1 , not(2) = 0xfffffffffffffffd , 3 + 0xfffffffffffffffd + 1 = 1, ,这个过程发生了溢出,C 标志位置为 1, 所以 b.cs 的判断条件成立,跳转到标签 1 处,继续执行。BFI 指令把 X1 寄存器中的 Bit[3,0] 设置为 X0 寄存器中的 Bit[7,4], X0 寄存器中的 Bit[7,4] ,X0 寄存器的值是 0x50。

做一位会读书的Linux工程师 2905

(UE5 5.2)HISM Mobile DrawInstance在渲染层的实现浅分析

在 (UE4 4.27) UHierarchicalInstancedStaticMesh(HISM)原理分析 这篇博客大致介绍HISM组件从游戏线程到渲染线程的重建KD-Tree和剔除并提交DrawCall逻辑,但是没有分析渲染层的大致数据结构和实现. 可以看出FHierarchicalStaticMeshSceneProxy 实际存储Instance数组数据来自于FInstancedStaticMeshSceneProxy FHierarchicalStaticMeshSceneProxy只是以FClu

qq_29523119的博客 2725

PostgreSQL 实战:行级安全策略(RLS)详解

PostgreSQL的行级安全(RLS)机制实现了细粒度的数据访问控制,通过动态过滤行数据满足多租户隔离、隐私保护等需求。本文系统介绍了RLS的核心原理、配置方法及实践建议:1) 启用RLS后需定义策略,通过USING和WITH CHECK条件控制访问;2) 适用于SaaS、医疗金融等场景,但需注意COPY命令、外键等特殊情况;3) 建议配合会话变量、索引优化和文档化策略使用。文章还提供了多租户隔离等实战案例,并分析了RLS对查询性能的影响及优化方案。RLS将安全控制下沉至数据库层,显著提升应用安全性和可维

数据知道的博客 3153

Linux内核中ns级别的高精度计时方法

假设CPU的主频是2GHz,则经过换算后CPU执行一条指令的时间就是0.5ns,因为它依赖底层寄存器不受上层系统软件的干扰,因此只要读取这个寄存器就可以知道当前CPU总共执行了多少条指令,而将该指令总数累积起来换算成时间,就可以得到代码的执行耗时。接触过STM32等单片机的同学可能会知道,在STM32当中会提供多个定时器,比如普通定时器、高级定时器等,这些都是硬件定时器,可以提供计数、计数比较功能,计数频率由系统时钟经过分频后决定,而且计数过程中不受系统软件的影响,可以实现较高精度的计时。...

weixin_71478434的博客 2076

SAP Fiori Launchpad 上看不到任何 tile 应该怎么办?

中心UI组件是一个框架,为所有SAPFiori应用程序提供公共基础设施SAPFiorilaunchpad是所有SAPFioriUI的基础,并为SAPFiori应用程序提供基本功能,如登录,界面大小,应用程序之间的导航,和基于角色的应用程序目录。ABAP前端服务器包含所有基础设施组件,用于为客户端生成SAPFiori应用程序特定的UI,并与SAPBusinessSuite后端系统通信。SAPFiori应用程序的处理过程如下首先,客户端加载SAPFiori应用程序的界面。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 942

Arm64 基础指令集介绍

Arm64 基础指令集介绍

世界那么大,我想去看看~【随心更新,看世界去了😄】 3868

MATLAB基础应用精讲-【强化学习】Actor - Critic 算法(附python代码实现)

这种架构结合了策略梯度方法(Policy - Gradient Methods)和价值函数估计方法(Value Function Estimation Methods)的优点。在强化学习中,智能体(Agent)需要通过与环境(Environment)的交互来学习最优的行为策略,以获得最大的累积奖励(Cumulative Reward)。

qq_36130719的博客 363

全志F1C100S/F1C200S学习笔记(1)——基础简介及资料

资料: 荔枝派资料下载站 荔枝派github 荔枝派中文论坛 荔枝派DIY-github资料 荔枝派Nano 全流程指南 芒果派 坑网

丨晋丨 1万+

arm寄存器虚拟化分析

本文深入探讨了ARM架构关键寄存器在虚拟化环境中的处理机制。VBAR_EL1作为异常向量表基址寄存器,若直接暴露给Guest OS会破坏异常注入机制;ELR_ELx和SPSR需要区分真实/虚拟异常场景;定时器寄存器(CNTP_*)必须虚拟化以实现时间隔离;GIC需要虚拟化以解决中断路由问题;SCTLR和CPACR涉及MMU和浮点单元控制;PMCR则关乎性能监控资源隔离。ARM通过硬件辅助虚拟化技术(如GICv3+的GICH/GICV机制)优化性能,确保各虚拟机获得独立的硬件视图,同时维持Hypervisor

luopandeng的专栏 1150

CDD数据库文件制作(二)——服务配置(0x27)

主要根据诊断调查表,针对0x27服务在CDD中的每一步配置给出详细介绍 1.会话切换配置 1.1.根据诊断调查表进行信息提取 1.2.子功能添加 1.2.1.Level1安全等级1创建 1.2.2.Level3安全等级3创建 1.2.3.安全等级名字查看与修改 1.3.会话切换信息提取(应用程序下) 1.4.会话转换配置(应用程序下) 1.5.会话切换信息提取(引导程序下) 1.6.会话转换配置(引导程序下) 2.安全等级配置信息提取 2.1.安全访问配置(level1) 2.2.安全访问配置(level2

LOVE135149的博客 2930

慢慢欣赏arm64内核启动8 primary_entry之el2_setup代码第六部分

【代码】慢慢欣赏arm64内核启动8 primary_entry之el2_setup代码第六部分。

shipinsky的博客 914

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

慢慢欣赏arm64内核启动20 primary_entry之__cpu_setup代码第二部分

【代码】慢慢欣赏arm64内核启动20 primary_entry之__cpu_setup代码第二部分。

shipinsky的博客 1030

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

慢慢欣赏arm64内核启动4 primary_entry之el2_setup代码第二部分

el2_setup继续执行就到了EL2异常等级的虚拟化部分的解析和处理部分。

shipinsky的博客 925

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

慢慢欣赏arm64内核启动23 primary_entry之__cpu_setup代码第五部分

CONFIG_ARM64_HW_AFDBM 是 Linux 内核的一个配置选项,用于启用 ARMv8.1 架构扩展中的硬件功能,该功能支持硬件更新页面表项中的访问(Access)和脏(Dirty)标志位。同样,如果向设置了 DBM 位的只读页面写入,将清除只读位(AP[2]),而不是触发权限故障。当在 TCR_EL1 寄存器(HA 和 HD 位)上启用此功能时,如果访问了清除了 PTE_AF 位的页面,则会设置该位,而不是触发访问标志故障。第2行到第6行为注释,含义为使能“硬件访问标记位”。

shipinsky的博客 879

慢慢欣赏arm64内核启动6 primary_entry之el2_setup代码第四部分

【代码】慢慢欣赏arm64内核启动6 primary_entry之el2_setup代码第四部分。

shipinsky的博客 557

慢慢欣赏arm64内核启动5 primary_entry之el2_setup代码第三部分

解析完虚拟化部分,我们继续分析启动过程中,对中断控制器的处理。

shipinsky的博客 814

慢慢欣赏arm64内核启动3 primary_entry之el2_setup代码第一部分

分析完el2_setup的注释和代码段的位置之后,我们正式开始学习el2_setup的实现。

shipinsky的博客 423

慢慢欣赏arm64内核启动21 primary_entry之__cpu_setup代码第三部分

展示代码 /* * Set/prepare TCR and TTBR. We use 512GB (39-bit) address range for * both user and kernel. */ mov_q x10, TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SMP_FLAGS | \ TCR_TG_FLAGS | TCR_KASLR_FLAGS | TCR_ASID16 | \ TCR_TBI0 | TCR_A1 | TC

shipinsky的博客 1277

慢慢欣赏arm64内核启动9 primary_entry之el2_setup代码第七部分

【代码】慢慢欣赏arm64内核启动9 primary_entry之el2_setup代码第七部分。

shipinsky的博客 325

慢慢欣赏arm64内核启动19 primary_entry之__cpu_setup代码第一部分

也就是说,位域bit12设置为1时,在EL0异常等级下,访问 MDCCSR_EL0, DBGDTR_EL0, DBGDTRTX_EL0, and DBGDTRRX_EL0 将会切换到 EL1 异常等级。第14, 15行涉及的寄存器 CPACR_EL1, Architectural Feature Access Control Register 的位域 bits[21:20]daifclr 涉及到 pstate 寄存器的 bits[9:6],分别是 DAIF,8对应 bit[9],表示清除调试掩码。

shipinsky的博客 1130

慢慢欣赏arm64内核启动24 primary_entry之__cpu_setup代码第六部分

第1行到第3行是注释,准备寄存器 SCTLR,SCTLR 是什么东东我们继续分析。第4行涉及宏定义 SCTLR_EL1_SET,定义如下。

shipinsky的博客 1199

慢慢欣赏arm64内核启动22 primary_entry之__cpu_setup代码第四部分

在该宏定义里面,ID_AA64MMFR0_EL1, AArch64 Memory Model Feature Register 0。第4行涉及到宏定义 tcr_compute_pa_size 和 TCR_IPS_SHIFT。提供 EL1 异常模式下 内存模型和内存管理的信息,涉及到的宏定义如下。第1到第3行是注释,含义是设置 TCR_EL1 的 IPS 域。其中,tcr_compute_pa_size 的定义如下。我们可以看到 bit[3] 始终为0, 所以可以忽略掉。

shipinsky的博客 890

慢慢欣赏arm64内核启动2 primary_entry之el2_setup注释部分

primary_entry执行完保存参数的函数后,进入el2_setup函数查看调用函数的注释,含义是切换到EL1模式,出参为w0,保存进入内核时的异常等级。看到这个注释,我联想起异常返回章节的通过sppr_elX和elr_elX切换异常等级的方法,我们分析代码看看是否这样实现的。该函数较长,我们分段进行欣赏。

shipinsky的博客 348
上一篇: 慢慢欣赏arm64内核启动6 primary_entry之el2_setup代码第四部分
下一篇: 慢慢欣赏arm64内核启动8 primary_entry之el2_setup代码第六部分
天麓
博客等级 码龄22年 323粉丝 437原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值