PSTATE 的本质
愉快的打开 Arm® Architecture Reference Manual for A-profile architecture 查看 D1.4 中对 PSTATE 的介绍
Process state, or PSTATE, is an abstraction of process state information.
翻译过来大概是:PSTATE 是处理器的状态信息。完全没有说 PSTATE 是个寄存器,所以很多文章轻巧的说 PSTATE 是个寄存器,要么是因为作者存在误解,要么就是作者接受了这个对新手存在误导的习惯。
PSTATE 是处理器的状态信息,它的各个域指示处理器当前的状态,如下图,A, I, F 域指示中断屏蔽的情况:
这些信息一定是可以体现在硬件上的,否则它怎么发挥相应的功能呢。所谓“体现在硬件上”,也就是 CPU 可以感知这些域的值,软件也可以读取或者设置这些域。为做到这些,我们需要知道 PSTATE 在物理上是怎么存储的。
实际上,PSTATE (本质上是状态信息)存储在一些分散的特殊寄存器里,Reference Manual 的 C5.2 节开头列举了这些寄存器(我不知道全不全)。比如 DAIF 寄存器(这才是真正的寄存器)保存了 PSTATE 中的 D, A, I, F 位,而 CPU 和软件实际上是通过 DAIF 寄存器来得知 PSTATE 中的 D, A, I, F 位的。
所以可以认为 arm 中有一系列寄存器如 DAIF 可以设置处理器的状态,人们统一把这些寄存器保存的信息称为 PSTATE。
SPSR 寄存器
SPSR 寄存器和 PSTATE 有密不可分的关系,文章中经常能看到这样的描述:SPSR 保存陷入异常前的 PSTATE。这容易让人错误的认为 SPSR 就是所谓 “PSTATE”寄存器。现在我们已经知道了 PSTATE 实际上存储在哪里,SPSR 只是在切换上下文时作为缓冲使用。(不过它确实把 PSTATE 整合起来保存在一个寄存器里了)。
具体来说,能够 “take to”的异常级都有自己的 SPSR 寄存器,也就是 SPSR_ELx,x 从 1 到 3。比如当发生异常并陷入到 el2 时,异常前的 PSTATE(也许是一部分)被硬件自动保存到 SPSR_EL2。当使用 eret 从这个异常处理返回时,SPSR_EL2 中保存的 PSTATE 会被自动恢复到前文说的保存 PSTATE 的寄存器中。这就是 SPSR 的作用,可以参考 Reference Manual 的 C5.2.19 节中对 SPSR 各个位的解释和描述。