在 AArch64 状态下访问 AArch32 寄存器

Access to AArch32 registers in AArch64 state

我在学习ARMv8异常处理的时候看到下面的句子:

When taking an exception from AArch32 to AArch64, there are some special considerations. AArch64 handler code can require access to AArch32 registers and the architecture therefore defines mappings to allow access to AArch32 registers.

还有银行地图: enter image description here

所以我想问一下:

  1. 我们何时以及为何需要访问 AArch64 状态下的 AArch32 寄存器?
  2. 这个映射table对程序员可见吗?编码时是否需要写对应的Wn?或者只是 Rn?

一个典型的用例是希望能够 运行 32 位 ARM 应用程序的 64 位操作系统。它将 运行 处于 AArch32 状态的 EL0 的应用程序,而处于 AArch64 状态的 OS 运行 处于 EL1 的应用程序。

假设32位应用程序需要进行系统调用。它将在 AArch32 寄存器中设置参数并导致 svc / swi 异常。 OS 的异常处理程序 运行ning 在 AArch64 状态下的 EL1 中,需要能够检索这些寄存器的内容以适当地处理系统调用。因此映射告诉它,例如,应用程序写入 r1 的任何内容都将在 x1.

中找到

编写代码时,您只需使用您正在编写的状态 (AArch32/AArch64) 中可用的任何寄存器集。对于 32 位代码,您可以编写 r0、r1、r2 等,而对于 64 位代码,您可以使用 w0/x0、w1/x1 等。对于应用程序编程,映射无关紧要,只会进入如果您正在编写需要在两种状态之间进行交互的 OS 代码,请播放。