gpt4 book ai didi

memory-management - 为什么堆栈地址会朝着减少内存地址的方向增长?

转载 作者:行者123 更新时间:2023-12-03 08:51:39 25 4
gpt4 key购买 nike

我在教科书中读到堆栈通过减少内存地址而增长;即从高地址到低地址。这可能是一个糟糕的问题,但我没有理解正确的概念。你可以解释吗?

最佳答案

首先,它依赖于平台。在某些体系结构中,堆栈从地址空间的底部开始分配并向上增长。

假设像 x86 这样的架构从地址空间的顶部向下堆栈,这个想法非常简单:

===============     Highest Address (e.g. 0xFFFF)
| |
| STACK |
| |
|-------------| <- Stack Pointer (e.g. 0xEEEE)
| |
. ... .
| |
|-------------| <- Heap Pointer (e.g. 0x2222)
| |
| HEAP |
| |
=============== Lowest Address (e.g. 0x0000)

要增加堆栈,您需要减少堆栈指针:
===============     Highest Address (e.g. 0xFFFF)
| |
| STACK |
| |
|.............| <- Old Stack Pointer (e.g. 0xEEEE)
| |
| Newly |
| allocated |
|-------------| <- New Stack Pointer (e.g. 0xAAAA)
. ... .
| |
|-------------| <- Heap Pointer (e.g. 0x2222)
| |
| HEAP |
| |
=============== Lowest Address (e.g. 0x0000)

如您所见,为了增加堆栈,我们将堆栈指针从 0xEEEE 减少到 0xAAAA,而要增加堆,您必须增加堆指针。

显然,这是对内存布局的简化。实际的可执行文件、数据部分……也被加载到内存中。此外,线程有自己的堆栈空间。

你可能会问,为什么栈要向下增长。好吧,正如我之前所说的,有些架构做相反的事情,使堆向下增长而堆栈向上增长。将堆栈和堆放在相对的两侧是有意义的,因为它可以防止重叠并允许两个区域自由增长,只要您有足够的可用地址空间。

另一个有效的问题可能是:程序不应该减少/增加堆栈指针本身吗?架构如何将一个强加给程序员?为什么它不像依赖于架构那样依赖于程序?
虽然您几乎可以与架构作斗争并以某种方式在相反的方向上摆脱您的堆栈,但有一些说明,特别是 callret直接修改堆栈指针会假设另一个方向,弄得一团糟。

关于memory-management - 为什么堆栈地址会朝着减少内存地址的方向增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4560720/

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