簡體   English   中英

堆棧和堆內存的C程序

[英]Stack and heap memory of a C program

我試圖了解CPU在跟蹤程序堆棧/堆分配中的作用。

閱讀一些材料,我發現了這個:

堆棧區域傳統上與堆區域相鄰並向相反方向增長; 當堆棧指針遇到堆指針時,可用內存耗盡。

堆棧和堆指針是否存儲在程序特定的寄存器中?

如果堆棧指針指向堆棧的頂部,並且(我假設)堆指針指向堆的末尾,這些指針如何在不覆蓋內存(溢出)的情況​​下滿足?

這在現代系統中如何工作?

堆棧和堆指針是否存儲在程序特定的寄存器中?

基於堆棧的體系結構的CPU(代表當今使用的絕大多數CPU)具有堆棧指針的特殊寄存器。 這是可能的,因為堆棧本質上不會碎片化。 因此,單個指針就足夠了。

沒有“堆指針”之類的東西,因為堆可能是碎片化的數據結構。 堆分配器保留一個可用於分配的特殊內存片段表,並在程序分配和釋放內存時對其進行調整。 內存管理器還保留指向從堆分配的最高地址的指針。

如果堆棧指針指向堆棧的頂部,並且(我假設)堆指針指向堆的末尾,這些指針如何在不覆蓋內存(溢出)的情況​​下滿足?

由於堆棧指針不能在不引起錯誤的情況下交叉,因此許多系統將堆棧的大小限制為一定數量,並確保內存分配器不會讓堆的高點超過堆棧的上限。

注意:在支持並發的系統上,一次可能有多個活動堆棧處於活動狀態。 在這種情況下,堆棧彼此相鄰設置,監控上限以檢測堆棧溢出。 這篇文章描述了檢測堆棧溢出的技術

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM