stack - 如何确定堆栈底部?

标签 stack

A stack is a contiguous block of memory containing data. A register called the stack pointer (SP) points to the top of the stack. The bottom of the stack is at a fixed address.



内核如何将堆栈底部固定为

最佳答案

我输入了一个较长的答案,但结果很困惑,所以这是一个较短的答案...

当一个进程启动时,它需要一个堆栈来存储临时值(即自动分配)或调用函数时的堆栈帧。该堆栈的内存必须来自某个地方。

因此,操作系统要做的是在虚拟内存中为堆栈创建一个映射,并将堆栈指针分配给该块的高地址。在递减堆栈中,在递归引用之前递减堆栈指针时,初始堆栈指针实际上是映射空间中最后一个地址之后的地址。

当进程尝试将某些东西放到堆栈上时,将导致对该内存区域的访问,该内存区域未映射任何物理RAM。这会导致页面错误,导致操作系统将RAM中使用最少(或接近它)的页面踢到交换驱动器或页面文件中,并将物理RAM页面重新分配给要访问的堆栈页面。现在已经有了物理RAM,操作系统将返回并继续执行该过程,从而将推送的数据放入堆栈内存中。

那么,如果将所有内容从堆栈中弹出,然后再次尝试弹出,会发生什么情况呢?最后一个弹出窗口(堆栈指针处于其初始值)会导致访问未映射到堆栈的虚拟内存地址。这会导致段错误,这意味着该进程尝试访问它从未分配的内存。操作系统通过终止该进程并清理所有可能的响应。

为什么不将页面映射到堆栈的末尾?因为这将导致读取未初始化的RAM,其中将包含曾经使用该物理RAM页面的所有内容。根本不可能产生一个功能正常的程序(更不用说这是一个巨大的安全隐患),因此,最好还是终止该程序。

关于stack - 如何确定堆栈底部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2542344/

相关文章:

c - ARM 程序集 - 监视堆栈指针

c - 需要帮助 : Stack using a pointer in C

java - Mapstruct java.util.Stack 转换

javascript - 我将如何解决我对这个曼哈顿天际线/石墙的处理方法,我哪里出错了? Javascript

c++ - 压入 STL 堆栈是通过引用传递的,但是堆栈是否复制了值?

c - 粉碎堆栈不起作用

android - 从 native 代码查找 Dalvik 堆栈上 Java 局部变量的内存地址

javascript - 递归 setTimeout 使堆栈增长

c++ - 堆栈抛出内存访问冲突

C#克隆一个堆栈