<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 一條進程的棧區(qū)、堆區(qū)、數(shù)據(jù)區(qū)和代碼區(qū)在內存中的映射

          一條進程的棧區(qū)、堆區(qū)、數(shù)據(jù)區(qū)和代碼區(qū)在內存中的映射

          作者: 時間:2016-11-10 來源:網絡 收藏
          l棧區(qū):主要用來存放局部變量,傳遞參數(shù),存放函數(shù)的返回地址。.esp始終指向棧頂,棧中的數(shù)據(jù)越多, esp的值越小。

          l堆區(qū):用于存放動態(tài)分配的對象,當你使用malloc和new等進行分配時,所得到的空間就在堆中。動態(tài)分配得到的內存區(qū)域附帶有分配信息,所以你能夠free和delete它們。

          本文引用地址:http://www.ex-cimer.com/article/201611/317090.htm

          l數(shù)據(jù)區(qū):全局,靜態(tài)和常量是分配在數(shù)據(jù)區(qū)中的,數(shù)據(jù)區(qū)包括bss(未初始化數(shù)據(jù)區(qū))和初始化數(shù)據(jù)區(qū)。

          注意:

          1)堆向高內存地址生長;

          2)棧向低內存地址生長;

          3)堆和棧相向而生,堆和棧之間有個臨界點,稱為stkbrk。

          1、一條進程在內存中的映射

          假設現(xiàn)在有一個程序,它的函數(shù)調用順序如下:

          main(...) ->; func_1(...) ->; func_2(...) ->; func_3(...),即:主函數(shù)main調用函數(shù)func_1;函數(shù)func_1調用函數(shù)func_2;函數(shù)func_2調用函數(shù)func_3。

          當一個程序被操作系統(tǒng)調入內存運行,其對應的進程在內存中的映射如下圖所示:

          注意:

          l隨著函數(shù)調用層數(shù)的增加,函數(shù)棧幀是一塊塊地向內存低地址方向延伸的;

          l隨著進程中函數(shù)調用層數(shù)的減少(即各函數(shù)調用的返回),棧幀會一塊塊地被遺棄而向內存的高址方向回縮;

          l各函數(shù)的棧幀大小隨著函數(shù)的性質的不同而不等,由函數(shù)的局部變量的數(shù)目決定。

          l未初始化數(shù)據(jù)區(qū)(BSS):用于存放程序的靜態(tài)變量,這部分內存都是被初始化為零的;而初始化數(shù)據(jù)區(qū)用于存放可執(zhí)行文件里的初始化數(shù)據(jù)。這兩個區(qū)統(tǒng)稱為數(shù)據(jù)區(qū)。

          lText(代碼區(qū)):是個只讀區(qū),存放了程序的代碼。任何嘗試對該區(qū)的寫操作會導致段違法出錯。代碼區(qū)是被多個運行該可執(zhí)行文件的進程所共享的。

          l進程對內存的動態(tài)申請是發(fā)生在Heap(堆)里的。隨著系統(tǒng)動態(tài)分配給進程的內存數(shù)量的增加,Heap(堆)有可能向高址或低址延伸,這依賴于不同CPU的實現(xiàn),但一般來說是向內存的高地址方向增長的。

          l在未初始化數(shù)據(jù)區(qū)(BSS)或者Stack(棧區(qū))的增長耗盡了系統(tǒng)分配給進程的自由內存的情況下,進程將會被阻塞,重新被操作系統(tǒng)用更大的內存模塊來調度運行。

          l函數(shù)的棧幀:包含了函數(shù)的參數(shù)(至于被調用函數(shù)的參數(shù)是放在調用函數(shù)的棧幀還是被調用函數(shù)棧幀,則依賴于不同系統(tǒng)的實現(xiàn))。函數(shù)的棧幀中的局部變量以及恢復該函數(shù)的主調函數(shù)的棧幀(即前一個棧幀)所需要的數(shù)據(jù),包含了主調函數(shù)的下一條執(zhí)行指令的地址。

          2、函數(shù)的棧幀

          函數(shù)調用時所建立的棧幀包含下面的信息:

          1)函數(shù)的返回地址。返回地址是存放在主調函數(shù)的棧幀還是被調用函數(shù)的棧幀里,取決于不同系統(tǒng)的實現(xiàn);

          2)主調函數(shù)的棧幀信息,即棧頂和棧底;

          3)為函數(shù)的局部變量分配的??臻g;

          4)為被調用函數(shù)的參數(shù)分配的空間取決于不同系統(tǒng)的實現(xiàn)。

          注意:

          lBSS區(qū)(未初始化數(shù)據(jù)段):并不給該段的數(shù)據(jù)分配空間,僅僅是記錄了數(shù)據(jù)所需空間的大小。

          lDATA(初始化的數(shù)據(jù)段):為數(shù)據(jù)分配空間,數(shù)據(jù)保存在目標文件中。



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();