ARMv8-A相关历史文章:
与ARMv7-A兼容,意味着在AArch32执行状态中的ARMv8-A处理器来说,必须与ARMv7-A处理器中通用寄存器之间存在一些对应关系。在ARMv7-A中,有用于软件使用的16个32-bit通用寄存器(R0-R15),其中R0-R15能用于通用的数据存储,R15是PC寄存器,在处理器执行指令时会修改它的值。软件可以访问CPSR的值,在异常发生时将CPSR拷贝到SPSR中,异常处理结束后再从SPSR恢复到CPSR中。
哪些寄存器可以被访问,以及在哪里被访问,取决于软件在执行时的处理器模式和寄存器本身,这个被称为备份(banking),它们使用物理上不同的存储,通常只能在特殊的处理器模式下才能使用。下图中的灰色部分寄存器表示的就是备份的(banked)。
ARMv7中使用备份(banking)来减少异常的延迟,然而,这也意味着寄存器的数量相当多,一次只能使用不到一半。
ARMv8-A使用31个64-bit的通用寄存器,在所有Exception Level都能访问。
11.1 System registers at AArch32
在ARMv7-A体系架构中,系统寄存器是通过CP15来访问的,CP15寄存器与AArch64中的系统寄存器也存在一个映射关系。
许多系统寄存器都是32-bit的,在AArch32和AArch64之间都是一一映射的,比如AArchh32中的Hyp System Control Register(HSCTLR)映射到SCTLR_EL2。
有些AArch64系统寄存器是64-bit的,这种情况下通常映射为两个AArch32 CP15寄存器,比如:
- HCR映射到HCR_EL2[31:0]
- HCR2映射到HCR_EL2[63:32]
11.2 PSTATE at AArch32
在ARMv8-A中,传统使用的CPSR中的字段以PSTATE的形式来呈现,可以独立访问。PSTATE包含了AArch32中所特有的状态:
下图中PSTATE的字段只能被AArch32来访问: