gpt4 book ai didi

cpu-architecture - 字节序和堆栈增长方向之间的关系

转载 作者:行者123 更新时间:2023-12-01 05:18:10 25 4
gpt4 key购买 nike

处理器的字节序与堆栈增长方向之间是否存在关系?

例如, x86 架构 是 little endian 并且堆栈向下增长(即它从最高地址开始并随着每个 push 操作向低地址增长)。同样,在 SPARC 架构 ,这是大端,堆栈从最低地址开始,向上增长到更高的地址。

这种关系模式几乎可以在所有架构中看到。 我相信这个未说明的约定一定是有原因的。这可以从计算机架构或操作系统的角度解释吗?这是为了对处理器内部的微码进行一些优化吗?这是否以某种方式帮助内核?或者可能是其他原因?

提前致谢!

最佳答案

堆栈增长方向与整数字节序正交。
更宽的整数(字)内的字节顺序与堆栈推送是从堆栈指针中增加还是减少之间存在零联系。就推送而言,存储数据是一个单一的操作。
将寄存器宽度整数映射到内存中的字节使用与堆栈指针 inc/dec 逻辑不同的硬件;我假设正常的设计是使用与非推送/弹出存储/加载相同的硬件,并且只是像任何其他“单词”存储一样处理来自推送的存储。不是任何一种一次一个字节的奇怪的东西,它会一个一个地递增堆栈指针。

This relationship pattern is seen in almost all architectures.


呃,真的不是。许多现代 RISC ISA(例如 MIPS、PowerPC、ARM)具有可选的字节序 1,并且与堆栈增长方向无关。
What is the direction of stack growth in most modern systems?表明在大多数主流系统上,堆栈增长方向通常是按照惯例或要求向下的,包括大端系统。
根据该问答的答案, SPARC 上的主流 OS/ABI 选择向下扩展堆栈 .向上是 SPARC 上的一个选项,但正常的选择是像其他系统一样向下。

Can this be explained from computer architecture or OS point of view?


我们可以解释的是,向下是事实上的标准。 IDK 为什么 SPARC 费心做出向上的选择。堆栈在可用内存的顶部,底部有固定地址的静态代码/数据,没有分页/虚拟内存显然是很自然的。 https://softwareengineering.stackexchange.com/questions/137640/why-does-the-stack-grow-downward
所以这就是我们到达这里的方式。
在某些 ISA 上,例如MIPS,堆栈增长方向纯粹由软件决定。硬件不会隐式/异步地使用堆栈,并且没有推送/弹出指令可以更有效地以一种或另一种方式进行。
但正常的选择还是向下。
其他 ISA 就像 x86,其中异步中断将内容推送到内核堆栈,迫使一个方向。或者至少以一种方式存在偏差,通过为一个方向提供有效的推送/弹出(如 ARM Thumb 和 x86 的 push/ pop )。更不用说 x86 的 call/ ret推送/弹出返回地址而不是仅写入链接寄存器的指令。
如果没有方向选择,大多数 ISA 中的一个固定方向是向下,但@chux 评论说 PIC24 具有向上的堆栈增长。

我很确定所有这些都有大端和小端示例,或者至少可以配置为大端或小端的双端系统。

脚注 1:一些特定的 ARM 或 MIPS CPU 的字节序是硬连线的,不能运行时选择,因为它基本上是一个无用的功能,并且浪费了嵌入式芯片。不确定现代 POWER 硬件; Godbolt 编译器资源管理器 ( https://godbolt.org/ ) 具有 PowerPC64 和 PowerPC64le 编译器,但这并不能告诉我们它们是否仍然相关。

关于cpu-architecture - 字节序和堆栈增长方向之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18470053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com