写入 ARMv8 上的 SP 是否也会写入 SP_ELx?

问题描述 投票:0回答:1

我一直在尝试通读 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?

我试图阅读这方面的手册,但它似乎相当含糊,可以用任何一种方式解释。

assembly arm arm64 osdev low-level
1个回答
0
投票

使用手册的K.a版本:

第 B1-182 页,B1.2.3 下:

SP[]
访问器没有参数,用于在当前异常级别读取或写入当前选定的64位堆栈指针。

点击

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
寄存器之一。

© www.soinside.com 2019 - 2024. All rights reserved.