Memory management 为什么堆栈地址会朝着减少内存地址的方向增长?
我在教科书中读到,堆栈通过减少内存地址而增长;也就是说,从较高的地址到较低的地址。这可能是个糟糕的问题,但我没有正确理解这个概念。你能解释一下吗?首先,它取决于平台。在某些体系结构中,堆栈从地址空间的底部分配并向上增长 假设像x86这样的体系结构,堆栈从地址空间的顶部向下生长,想法非常简单:Memory management 为什么堆栈地址会朝着减少内存地址的方向增长?,memory-management,stack,virtual-memory,callstack,Memory Management,Stack,Virtual Memory,Callstack,我在教科书中读到,堆栈通过减少内存地址而增长;也就是说,从较高的地址到较低的地址。这可能是个糟糕的问题,但我没有正确理解这个概念。你能解释一下吗?首先,它取决于平台。在某些体系结构中,堆栈从地址空间的底部分配并向上增长 假设像x86这样的体系结构,堆栈从地址空间的顶部向下生长,想法非常简单: =============== Highest Address (e.g. 0xFFFF) | | | STACK | | | |----
=============== Highest Address (e.g. 0xFFFF)
| |
| STACK |
| |
|-------------| <- Stack Pointer (e.g. 0xEEEE)
| |
. ... .
| |
|-------------| <- Heap Pointer (e.g. 0x2222)
| |
| HEAP |
| |
=============== Lowest Address (e.g. 0x0000)
===================最高地址(例如0xFFFF)
| |
|堆叠|
| |
|-------------|如今,这主要是因为它已经这样做了很长一段时间,很多程序都认为它是这样做的,没有真正的理由改变它
当恐龙在地球上漫游,计算机拥有8kB的内存时,如果你幸运的话,这是一个重要的空间优化。将堆栈的底部放在内存的最顶部,向下生长,将程序及其数据放在最底部,malloc
区域向上生长。这样,堆栈大小的唯一限制是程序+堆的大小,反之亦然。如果堆栈从4kB(例如)开始增长,则即使程序只需要几百字节的堆栈,堆也永远不会超过4kB(减去程序的大小)。Man CLONE:child_stack参数指定子进程使用的堆栈的位置。由于子进程和调用进程可能共享内存,因此子进程不可能与调用进程在同一堆栈中执行。因此,调用进程必须为子堆栈设置内存空间,并将指向该空间的指针传递给clone()。在所有运行Linux的处理器(HP PA处理器除外)上,堆栈向下增长,因此子堆栈通常指向为子堆栈设置的内存空间的最高地址。在x86上,堆栈向内存地址递减的主要原因是PUSH
指令使堆栈指针递减:
=============== 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)
递减堆栈指针,然后将源操作数存储在堆栈顶部
见第页。仅ASCII码为4-511英寸。+0.5英寸。:)但是,在回答“如何”时,这根本不能很好地回答“为什么”。是什么让这样定义堆栈如此常见和/或有用?@cHao:添加了几段来解决这个问题。@Mehrdad Afshari一些文本说这是因为我们可以在堆栈增长时保持偏移量非负downward@Mehrdad要访问堆栈帧的内容,我们只需要使用非负偏移值(因为堆栈从高到低增长,堆栈顶部始终是最低地址)高级编译器的设计和实现由Steven S.Muchnick page完成122@Jestin当前位置我认为他只是简单地提到了一个事实,这是选择堆栈位于顶部和向下生长的结果。他没有说这就是设计决策的原因。正如我之前所说,有一些架构允许堆栈向上生长(例如英特尔8051)或双向(ARM)。