<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/201611/317090.htm

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

注意:

1)堆向高內存地址生長(cháng);

2)棧向低內存地址生長(cháng);

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

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

假設現在有一個(gè)程序,它的函數調用順序如下:

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

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

注意:

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

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

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

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

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

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

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

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

2、函數的棧幀

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

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

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

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

4)為被調用函數的參數分配的空間取決于不同系統的實(shí)現。

注意:

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

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



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>