Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management 为什么堆栈地址会朝着减少内存地址的方向增长?_Memory Management_Stack_Virtual Memory_Callstack - Fatal编程技术网

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

Memory management 为什么堆栈地址会朝着减少内存地址的方向增长?,memory-management,stack,virtual-memory,callstack,Memory Management,Stack,Virtual Memory,Callstack,我在教科书中读到,堆栈通过减少内存地址而增长;也就是说,从较高的地址到较低的地址。这可能是个糟糕的问题,但我没有正确理解这个概念。你能解释一下吗?首先,它取决于平台。在某些体系结构中,堆栈从地址空间的底部分配并向上增长 假设像x86这样的体系结构,堆栈从地址空间的顶部向下生长,想法非常简单: =============== Highest Address (e.g. 0xFFFF) | | | STACK | | | |----

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

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

假设像x86这样的体系结构,堆栈从地址空间的顶部向下生长,想法非常简单:

===============     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)。