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/