3

背景: 在 AArch32 上,每种模式(FIQ、IRQ 等)都有一个 SP(R13)寄存器的“存储”副本。这允许不同的模式维护自己的独立堆栈。

现在在 AArch64 上似乎并非如此。例如:如果我们考虑 EL1,在 AArch64 上,相当于 IRQ 和 SVC 的两种模式是 EL1'h' 和 EL1't'(h = 处理程序和 t = 线程)。在这种情况下,'h' 和 't' 模式是否必须共享一个公共堆栈?我问是因为每个 EL 只有一个堆栈指针,即 SP_ELx。

问题:

  • AArch64 如何为 Linux 这样的操作系统管理这种差异。像 EL1'h' 和 EL1't' 这样的两种模式会共享同一个堆栈吗?
  • 与 AArch32 类似,Linux 对 IRQ 和 SVC 模式有不同的堆栈,在 AArch64 的情况下,为 EL1'h' 和 EL1't' 维护不同的堆栈需要做什么?
4

1 回答 1

3

首先,我们需要将 ARMv7/ARMv8(架构版本)与 AArch32/AArch64 执行状态(32 位与 64 位)分开。

ARMv8 处理器在 EL1(内核)提供 AArch32 执行状态,其异常模型与 ARMv7 中的相同。当 EL1 处于 AArch64 执行状态时,它使用了完全不同的异常处理模型。

AArch64 EL1 没有 IRQ 和 SVC 或 AArch32 的其他模式 - 这就是它需要/只有一个异常堆栈的原因。

于 2014-02-05T19:58:48.023 回答