我一直在尝试通读 ARM 手册,以了解 ARM 的架构是如何工作的。我知道每个 EL 处都有一个用于 SP 的系统寄存器,如 SP_EL0、SP_EL1 等。我还知道 PSTATE 中有一个 SPSel 位,用于选择是否在 EL 更改时从 SP_EL0 或 SP_ELx 获取堆栈指针。然而,我的问题是,SP 是否在架构上映射到相应的 SP_ELx 寄存器,或者 SP_ELx 是否在 EL 更改时复制到 SP 中?换句话说,如果说我写入SP,我是否也写入SP_ELx?
我试图阅读这方面的手册,但它似乎相当含糊,可以用任何一种方式解释。
使用手册的K.a版本:
第 B1-182 页,B1.2.3 下:
访问器没有参数,用于在当前异常级别读取或写入当前选定的64位堆栈指针。SP[]
点击
SP[]
可以进入页面 J1-13867,在这里我们可以看到 aarch64/functions/registers/SP
的伪代码:
// SP[] - assignment form // ====================== // Write to stack pointer from a 64-bit value. SP[] = bits(64) value if PSTATE.SP == '0' then SP_EL0 = value; else case PSTATE.EL of when EL0 SP_EL0 = value; when EL1 SP_EL1 = value; when EL2 SP_EL2 = value; when EL3 SP_EL3 = value; return; // SP[] - non-assignment form // ========================== // Read stack pointer with slice of 64 bits. bits(64) SP[] if PSTATE.SP == '0' then return SP_EL0; else case PSTATE.EL of when EL0 return SP_EL0; when EL1 return SP_EL1; when EL2 return SP_EL2; when EL3 return SP_EL3;
所以是的,
SP
始终映射到SP_ELn
寄存器之一。