为什么;ARM体系结构的过程调用标准“;(AAPCS)要求SP为8字节对齐?

为什么;ARM体系结构的过程调用标准“;(AAPCS)要求SP为8字节对齐?,arm,Arm,由于这是一个反复出现的话题,我提出了一个关于它的问题 根据: 5.2.1.1通用堆栈约束 SP mod 4=0。堆栈必须始终与字边界对齐 5.2.1.2公共接口处的堆栈约束 SP mod 8=0。堆栈必须是双字对齐的 8字节对齐背后的原因是什么?这是由于ldrd和STD 它们需要双字对齐。主要原因是STRD和LDRD只能在8字节对齐的地址上工作。因此,要在堆栈变量上使用它们,堆栈指针需要始终与8字节对齐 引述: 八字节堆栈对齐对于支持LDRD和STD指令的处理器尤其有利,例如,基于ARM

由于这是一个反复出现的话题,我提出了一个关于它的问题

根据:

5.2.1.1通用堆栈约束

  • SP mod 4=0。堆栈必须始终与字边界对齐
5.2.1.2公共接口处的堆栈约束

  • SP mod 8=0。堆栈必须是双字对齐的

8字节对齐背后的原因是什么?

这是由于ldrd和STD


它们需要双字对齐。

主要原因是STRD和LDRD只能在8字节对齐的地址上工作。因此,要在堆栈变量上使用它们,堆栈指针需要始终与8字节对齐

引述:

八字节堆栈对齐对于支持LDRD和STD指令的处理器尤其有利,例如,基于ARM体系结构v5TE和更高版本的处理器。如果堆栈没有八字节对齐,则使用LDRD和STD可能会导致对齐错误,具体取决于使用的目标和配置


ARM也在本文中详细解释了这一点。

可能的原因有很多

  • 来自的工具需要它
  • ldrd/strd
    在某些体系结构上需要它
  • 许多ARM总线的宽度为64位。8字节对齐将导致更快的内存访问
  • 缓存也是对齐的,通常宽度大于64位(128B,1024b)
  • 页表和TLB将跨越大于64位(1k或4k+)的大小
  • 可以用于异常(C++、信号等)帧遍历代码。八字节对齐允许使用额外的位
  • 唯一重要的是,标准如此规定。如果您不遵守此要求,编译器和工具将不会相互操作。主要是第1项意味着工具不会相互操作。代码将获取错误的值,否则将引发计算机异常。如果异常处理代码使用了第5项,它也可能会破坏一些东西

    主要是,有人做出选择这一事实意味着人们可以利用这一事实进行他们喜欢的任何用途,并且仍然相互操作。编译器将遵循标准的建议,因为他们需要与其他库和代码交互操作,而这些库和代码可能不是由他们生成的

    还需要注意的是,这适用于ARMv7/A。例如,Cortex M3(CM3_r0)的版本0在进入异常时未将SP与8的倍数对齐


    +1但“在为早于ARM V5TE的体系结构(无LDRD或STD)生成的代码中,或在符合ARM V7或更高体系结构的处理器上(当LDRD或STD的有效地址为4模8时,不会导致对齐故障)不会发生此故障。”在ARMv7上,当8字节对齐时,ldm和stm消耗的周期更少,以及指定对齐时的vld和vst。遵守IMO+1是一件容易的事情,但是“在为早于ARM V5TE(无LDRD或STD)的体系结构生成的代码中,或者在符合ARM V7或更高版本体系结构的处理器上(当LDRD或STD的有效地址为4模8时,这不会导致对齐错误)”这是wiki的答案
    ldrd/strd
    在许多其他问题中给出。最初指出64位对齐提供了更好的总线利用率。