3

我正在阅读有关 ARM v8 的 ARM 文档,但我很难找到在发生异常时允许从 32 位切换到 64 位(以及相反)的确切机制。首先,如果有人可以向我解释,那就太好了。

另外我想知道管理程序(在 EL2 中)是否可以运行不同类型的操作系统,在 EL1 中同时具有 32 位和 64 位?

最好的,

4

1 回答 1

4

对执行状态的限制是,更改只能发生在异常级别的更改中,并且异常级别不能使用比其上一个更宽的寄存器。因此,在 EL2 上使用 AArch64 的 64 位管理程序可以在 EL1 上同时支持 64 位和 32 位来宾,就像在 EL1 上的 64 位操作系统在 EL0 上支持 64 位和 32 位进程一样。如果你喜欢看一些真实的代码,KVM 的 arm64 端口正是这样一个虚拟机管理程序。另一方面,在 EL2 上使用 AArch32 的管理程序只能托管 32 位来宾。

更改异常级别的要求意味着您不能通过将异常带到您自己的级别来任意来回切换 - 您必须得到上述级别的支持才能为您执行此操作。

硬件确定最高实现异常级别的执行状态(即复位状态),然后每个 EL 都有一个寄存器宽度位控制下面的一个 - 如果实现了 EL3,则 SCR_EL3.RW 控制 EL2 的状态(或 EL1 在没有 EL2); 如果实现了 EL2,则 HCR.RW 控制 EL1;在 EL1,PSTATE.nRW 控制 EL0。

因此,EL0 的切换机制略有不同,因为 PSTATE.nRW 在 SPSR 中 - 这使得作为 EL1 正常异常返回的一部分有效地自动切换不同进程的状态。在更高的异常级别,管理程序/安全监视器还必须采取额外的步骤,对相关配置寄存器进行编程,作为在下拉之前恢复异常上下文的一部分。

于 2014-09-04T21:22:52.187 回答