我正在尝试了解CPU在跟踪程序堆栈/堆分配方面的作用。
阅读一些材料,我遇到过这个:
堆栈区域传统上与堆区域相邻并向相反方向增长;当堆栈指针遇到堆指针时,空闲内存耗尽。
堆栈和堆指针是否存储在程序特定的寄存器中?
如果堆栈指针指向堆栈的顶部,并且(我假设)堆指针指向堆的末尾,这些指针如何在不覆盖内存(溢出)的情况下满足?
这在现代系统中如何运作?
答案 0 :(得分:3)
堆栈和堆指针是否存储在程序特定的寄存器中?
基于堆栈的体系结构的CPU(代表当今使用的绝大多数CPU)具有堆栈指针的特殊寄存器。这是可能的,因为堆栈本质上不会碎片化。因此,单个指针就足够了。
没有"堆指针"因为堆可能是碎片化的数据结构。堆分配器保留一个可用于分配的特殊内存片段表,并在程序分配和释放内存时对其进行调整。内存管理器还保留一个指向从堆中分配的最高地址的指针。
如果堆栈指针指向堆栈的顶部,并且(我假设)堆指针指向堆的末尾,这些指针如何在不覆盖内存(溢出)的情况下满足?
由于堆栈指针无法交叉而不会导致错误,因此许多系统将堆栈的大小限制为一定数量,并确保内存分配器不会让堆的高点超过堆栈的上限
注意:在支持并发的系统上,一次可能有多个活动堆栈处于活动状态。在这种情况下,堆栈彼此相邻设置,监控上限以检测堆栈溢出。这是an article that describes techniques for detecting stack overflows。