您的位置:首页 > 教育 > 锐评 > 慢慢欣赏arm64内核启动7 primary_entry之el2_setup代码第五部分

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

2024/10/6 8:23:58 来源:https://blog.csdn.net/shipinsky/article/details/140944555  浏览:    关键词:慢慢欣赏arm64内核启动7 primary_entry之el2_setup代码第五部分

分析代码

	/* EL2 debug */mrs	x1, id_aa64dfr0_el1sbfx	x0, x1, #ID_AA64DFR0_PMUVER_SHIFT, #4cmp	x0, #1b.lt	4f				// Skip if no PMU presentmrs	x0, pmcr_el0			// Disable debug access trapsubfx	x0, x0, #11, #5			// to EL2 and allow access to
4:csel	x3, xzr, x0, lt			// all PMU counters from EL1

分析完毕 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.

第9行的含义使用csel指令,在ARM64架构中,csel(Conditional Select)指令是一种条件选择指令,用于根据条件码(Condition Flags)的结果来选择两个源操作数中的一个,并将结果存储到目标寄存器中。csel指令非常适合在条件分支之后使用,以避免分支的延迟和开销。
因此,csel x3, xzr, x0, lt 这条指令的含义是:如果最近一次算术或比较指令的结果表明某个值(这里不直接指定,因为lt条件是基于之前指令的隐式结果)小于另一个值(同样,这个比较也是隐式的,lt只关心条件是否满足),则将x0的值复制到x3中;如果条件不满足(即不小于),则将xzr(0)的值复制到x3中。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com