4. ARMv8 寄存器

4. ARMv8 寄存器

4.5.1 AArch32下的寄存器

兼容ARMv7 意味着 AArch32必须匹配ARMv7特权级别。这也意味着AArch32只处理ARMv7 32位通用寄存器。因此,ARMv8体系结构与AArch32执行状态提供的视图之间必须有一些对应关系。

请记住,在ARMv7体系结构中有16个32位通用寄存器(R0-R15)用于软件使用。其中15个(R0-R14)可用于通用数据存储。剩下的寄存器R15是程序计数器(PC),其值在处理器核心执行指令时被改变。软件还可以访问CPSR,而从之前执行的模式中保存的CPSR是SPSR。在发生异常时,CPSR将被复制到发生异常的模式的SPSR中。

访问这些寄存器中的哪一个,取决于软件正在执行的处理器模式和寄存器本身,这称为banking,第4-14页图4-7中的阴影寄存器称为banked。它们使用不同的物理存储,通常程序只有在特定模式下执行时才能访问。

在ARMv7中使用了banking来减少异常的延迟。然而,这也意味着在相当数量的寄存器中,任何时候可以使用的都不到一半。

相比之下,AArch64执行状态有31个64位通用寄存器,并且可以在所有异常级别中随时访问。在AArch64和AArch32之间的执行状态的切换意味着AArch64寄存器必须映射到AArch32(ARMv7)寄存器集。此映射如图4-8所示。

当在AArch32状态下执行时,AArch64寄存器的高32位是不可访问的。如果处理器在AArch32状态下工作,它将使用32位W寄存器,这相当于32位的ARMv7寄存器。

AArch32需要将banked寄存器映射到AArch64寄存器,否则这些寄存器将无法访问。

AArch32中的SPSR和ELR_Hyp寄存器是只能被系统指令访问的附加寄存器。它们没有被映射到AArch64体系结构的通用寄存器空间中。下面这些寄存器在AArch32和AArch64之间进行映射:

SPSR_svc映射到SPSR_EL1

SPSR_hyp映射到SPSR_EL2

ELR_hyp映射到ELR_EL2

以下寄存器仅在AArch32执行期间使用。由于在EL1上使用AArch64执行,所以,尽管在AArch64执行期间这些寄存器不可访问,但仍然保留了它们的状态。

SPSR_abt

SPSR_und

SPSR_irq

SPSR_fiq

SPSR寄存器只能在AArch64状态用于上下文切换的高异常级别下可访问。

同样,如果在AArch32的异常级别触发一个到AArch64异常级别的异常,则AArch64 ELR_ELn的高32位都为零。

相关推荐

刘诗诗是哪里人
365bet体育在线中文网

刘诗诗是哪里人

📅 08-20 👁️ 4466
2、《阴阳师》云冥界哪里多
365bet

2、《阴阳师》云冥界哪里多

📅 10-11 👁️ 3179