[英]Stack and heap memory of a C program
我試圖了解CPU在跟蹤程序堆棧/堆分配中的作用。
閱讀一些材料,我發現了這個:
堆棧區域傳統上與堆區域相鄰並向相反方向增長; 當堆棧指針遇到堆指針時,可用內存耗盡。
堆棧和堆指針是否存儲在程序特定的寄存器中?
如果堆棧指針指向堆棧的頂部,並且(我假設)堆指針指向堆的末尾,這些指針如何在不覆蓋內存(溢出)的情況下滿足?
這在現代系統中如何工作?
堆棧和堆指針是否存儲在程序特定的寄存器中?
基於堆棧的體系結構的CPU(代表當今使用的絕大多數CPU)具有堆棧指針的特殊寄存器。 這是可能的,因為堆棧本質上不會碎片化。 因此,單個指針就足夠了。
沒有“堆指針”之類的東西,因為堆可能是碎片化的數據結構。 堆分配器保留一個可用於分配的特殊內存片段表,並在程序分配和釋放內存時對其進行調整。 內存管理器還保留指向從堆分配的最高地址的指針。
如果堆棧指針指向堆棧的頂部,並且(我假設)堆指針指向堆的末尾,這些指針如何在不覆蓋內存(溢出)的情況下滿足?
由於堆棧指針不能在不引起錯誤的情況下交叉,因此許多系統將堆棧的大小限制為一定數量,並確保內存分配器不會讓堆的高點超過堆棧的上限。
注意:在支持並發的系統上,一次可能有多個活動堆棧處於活動狀態。 在這種情況下,堆棧彼此相鄰設置,監控上限以檢測堆棧溢出。 這篇文章描述了檢測堆棧溢出的技術 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.