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# - 用 C++ 编写的存储结构和类在哪里?

c - 堆栈框架崩溃时引用的值丢失

c - 使用 C 代码在 AVR 微 Controller 中设置堆栈指针

c - 为什么我的值(value)不会增加?内存踩踏/堆栈故障?

c++ - 确定 posix pthread 的堆栈使用情况?

java - 在 Java 中创建堆栈堆栈

c++ - 删除警告 : "variable ' result' is used uninitialized whenever 'if' condition is false"in c++

java - 我应该使用什么样的堆栈数据结构?

调用具有不同参数个数的 cdecl 函数

java - 为什么 pop() 应该接受一个参数?