新聞中心

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

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

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

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

        本文引用地址:http://www.104case.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)堆向高內(nèi)存地址生長(zhǎng);

        2)棧向低內(nèi)存地址生長(zhǎng);

        3)堆和棧相向而生,堆和棧之間有個(gè)臨界點(diǎn),稱為stkbrk。

        1、一條進(jìn)程在內(nèi)存中的映射

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

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

        當(dāng)一個(gè)程序被操作系統(tǒng)調(diào)入內(nèi)存運(yùn)行,其對(duì)應(yīng)的進(jìn)程在內(nèi)存中的映射如下圖所示:

        注意:

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

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

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

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

        lText(代碼區(qū)):是個(gè)只讀區(qū),存放了程序的代碼。任何嘗試對(duì)該區(qū)的寫(xiě)操作會(huì)導(dǎo)致段違法出錯(cuò)。代碼區(qū)是被多個(gè)運(yùn)行該可執(zhí)行文件的進(jìn)程所共享的。

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

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

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

        2、函數(shù)的棧幀

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

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

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

        3)為函數(shù)的局部變量分配的棧空間;

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

        注意:

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

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



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 庆元县| 封开县| 赞皇县| 彝良县| 鄂尔多斯市| 防城港市| 察隅县| 康定县| 普陀区| 宜春市| 石城县| 都江堰市| 从化市| 晋江市| 江陵县| 容城县| 留坝县| 鹤岗市| 温宿县| 清新县| 呼图壁县| 邵阳县| 鄂伦春自治旗| 永兴县| 广州市| 务川| 左云县| 南澳县| 饶平县| 霍城县| 和龙市| 昌邑市| 南部县| 临泽县| 麟游县| 华坪县| 元阳县| 招远市| 太康县| 南丰县| 延寿县|