C程序的堆栈和堆内存

我试图理解CPU在跟踪程序堆栈/堆分配中的作用。

读一些材料,我遇到了这个:

堆栈区域传统上与堆区相邻并朝相反的方向增长; 当堆栈指针遇到堆指针时,空闲内存耗尽。

堆栈和堆指针是否存储在程序特定的寄存器中?

如果堆栈指针指向栈顶,并且(我假设)堆栈指针指向堆栈的末尾,那么这些指针在不覆盖内存(溢出)的情况​​下会如何满足?

这在现代系统中如何工作?


堆栈和堆指针是否存储在程序特定的寄存器中?

基于堆栈的体系结构(代表当前使用的绝大多数CPU)的CPU具有特殊的堆栈指针寄存器。 这是可能的,因为堆栈本质上不会被分割。 因此,一个单一的指针就足够了。

没有“堆指针”这样的事情,因为堆可能是一个零碎的数据结构。 堆分配器保留一个特殊的内存片段表供分配,并在程序分配和释放内存时进行调整。 内存管理器还保存一个指向从堆中分配的最高地址的指针。

如果堆栈指针指向栈顶,并且(我假设)堆栈指针指向堆栈的末尾,那么这些指针在不覆盖内存(溢出)的情况​​下会如何满足?

由于堆栈指针不能在不引起错误的情况下交叉,因此许多系统会将堆栈的大小限制到一定数量,并确保内存分配器不会让堆栈的高点超过堆栈的上限。

注意:在支持并发的系统上,一次可能有多个活动的堆栈。 在这种情况下,堆栈被设置为彼此相邻,并监视上限以检测堆栈溢出。 这篇文章描述了检测堆栈溢出的技术。

链接地址: http://www.djcxy.com/p/79847.html

上一篇: Stack and heap memory of a C program

下一篇: Is this a memory leak since memory was allocated on stack?