堆棿垡螅基礎

一杰妓、堆椩逯危基礎——內(nèi)存區(qū)域

代碼是以進程的形式來執(zhí)行的,一個進程可能被分配到不同的內(nèi)存區(qū)域去執(zhí)行:

  • 代碼區(qū):這個區(qū)域內(nèi)存儲著被裝入執(zhí)行的二進制機器代碼巷挥,處理器會到這個區(qū)域取指并執(zhí)行
  • 數(shù)據(jù)區(qū):用于存儲全局變量/靜態(tài)變量等
  • 堆區(qū):進程可以在堆區(qū)動態(tài)的請求一定大小的內(nèi)存桩卵,并在使用完之后還給堆區(qū)。動態(tài)分配和回收是堆區(qū)的特點倍宾,是向高地址擴展的內(nèi)存區(qū)域雏节,通常由程序員來管理
  • 棧區(qū):用于動態(tài)的存儲函數(shù)之間的調用關系,以保證調用函數(shù)在返回時恢復到母函數(shù)中繼續(xù)執(zhí)行高职,是由操作系統(tǒng)來管理的钩乍。


    image.png

棧區(qū)

棧是向低地址擴展的數(shù)據(jù)結構,入棧時是從高地址向低地址擴展怔锌,是一塊連續(xù)的內(nèi)存的區(qū)域寥粹。通常用來存儲局部變量变过。棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預先規(guī)定好的,在windows下涝涤,棧的默認大小是2M媚狰,如果申請的空間超過棧的剩余空間,將提示overflow


image.png

堆區(qū)

堆是向高地址擴展的數(shù)據(jù)結構阔拳,是不連續(xù)的內(nèi)存區(qū)域崭孤,堆的大小受限于計算機的虛擬內(nèi)存。
操作系統(tǒng)中有一個記錄空閑內(nèi)存地址的鏈表糊肠,當系統(tǒng)收到程序的申請時辨宠,會遍歷該鏈表

  • 尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除货裹,并將該結點的空間分配給程序
  • 由于找到的堆結點的大小不一定正好等于申請的大小彭羹,系統(tǒng)會自動將多余的那部分重新放入空閑鏈表中。
  • 對于大多數(shù)系統(tǒng)泪酱,會在這塊內(nèi)存空間中的首地址記錄本次分配的大小派殷,這樣代碼中的delete語句才能正確的釋放本內(nèi)存空間


    image.png

區(qū)別

申請方式

棧:由系統(tǒng)自動分配。
堆:需要程序員自己申請墓阀,并指明大小毡惜,在c中malloc函數(shù) 例如p1=(char *)malloc(10)

申請效率

棧:系統(tǒng)自動分配,速度比較快斯撮,但是程序員無法控制
堆:由程序員分配的內(nèi)存经伙,一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片勿锅,不過用起來方便


二帕膜、堆棧基礎——函數(shù)調用

函數(shù)調用時溢十,將借助系統(tǒng)棧來完成函數(shù)狀態(tài)的保存和恢復


image.png

主函數(shù)中調用函數(shù)A垮刹,函數(shù)A又調用的函數(shù)B,函數(shù)B的返回值加上一個值作為函數(shù)A的返回值张弛,最后函數(shù)A的返回結果作為主函數(shù)的返回值


image.png
  • 這些代碼區(qū)中精確的跳轉都是在與系統(tǒng)棧巧妙的配合過程中完成的荒典。
  • 當函數(shù)被調用時,系統(tǒng)棧會為這個函數(shù)開辟一個新的棧幀吞鸭,并把它壓入棧中寺董。每個棧幀對應著一個未運行完的函數(shù)。棧幀中保存了該函數(shù)的返回地址和局部變量刻剥。從邏輯上講遮咖,棧幀就是一個函數(shù)執(zhí)行的環(huán)境:函數(shù)參數(shù)、函數(shù)的局部變量造虏、函數(shù)執(zhí)行完后返回到哪里等待御吞。
  • 當函數(shù)返回時踢械,系統(tǒng)棧會自動彈出該函數(shù)所對應的的棧幀,彈出棧幀意味著這個函數(shù)執(zhí)行完畢魄藕。


    image.png

    image.png

函數(shù)調用的步驟

棧是先進后出的數(shù)據(jù)結構

  • (1)參數(shù)入椖诹校——將參數(shù)從右向左依次壓入系統(tǒng)棧中
  • (2)返回地址入棧——將當前代碼區(qū)調用指令的下一條指令地址壓入棧中背率,供函數(shù)返回時繼續(xù)執(zhí)行
  • (3)代碼區(qū)跳轉——處理器從當前代碼區(qū)跳轉到被調用函數(shù)的入口(就是跳轉到被調用的函數(shù)處话瞧,再取指令時就從被調用的函數(shù)的代碼區(qū)開始取指令)
  • (4)棧幀調整。取指令時寝姿,會包括棧幀調整交排。具體包括
    保存當前棧幀狀態(tài)值,已備后面恢復本棧幀時使用饵筑。
    將當前棧幀切換到新棧幀埃篓。

三、堆椄剩基礎——常見寄存器和棧幀

寄存器

寄存器是中央處理器CPU的組成部分架专。寄存器是有限存儲容量的高速存儲部件,它們可以用來暫存指令玄帕、數(shù)據(jù)和地址部脚。我們常常看到32位CPU裤纹、64位CPU這樣的名稱委刘,其實指的就是寄存器的大小。32位CPU寄存器大小就是4字節(jié)鹰椒。CPU越大說明CPU一次處理的數(shù)據(jù)就越多
為了緩解CPU和內(nèi)存效率不對等的問題锡移,CPU自帶一級緩存和二級緩存,但是這些緩存還是不夠快漆际,于是將一些最常訪問的數(shù)據(jù)存放在寄存器中(寄存器的讀寫速度比內(nèi)存快很多)淆珊,CPU優(yōu)先讀取寄存器,再由寄存器跟內(nèi)存交換數(shù)據(jù)灿椅。

image.png

CPU套蒂、寄存器和內(nèi)存
CPU運算所需數(shù)據(jù)只能從寄存器存取钞支,寄存器會先從高速緩存區(qū)讀取數(shù)據(jù)茫蛹,不命中才會從內(nèi)存讀數(shù)據(jù)。而內(nèi)存中的數(shù)據(jù)也是先從磁盤緩存區(qū)(disk cache)讀數(shù)據(jù)烁挟,或者在磁盤緩沖區(qū)(disk buffer)存數(shù)據(jù)婴洼,最后才會交際最慢的磁盤。

ESP和EBP兩個寄存器

image.png
棧指針寄存器ESP(extended 寄存器 stack棧 pointer指針)

ESP標識了當前棧幀的頂部(相當于top)

基址指針寄存器ESP(extended 寄存器 base基址 pointer指針)

ESP標識了當前棧的底部(相當于base)

ESP和EBP之間的內(nèi)存空間為當前幀撼嗓,當前幀指的是系統(tǒng)棧中最頂部的棧幀柬采。**


image.png

函數(shù)棧幀中包含的信息

  • 局部變量
  • 棧幀狀態(tài)值欢唾,用于在本幀被彈出后恢復出上一個棧幀
  • 函數(shù)返回地址,以便函數(shù)返回時能夠恢復到函數(shù)被調用前的代碼區(qū)中繼續(xù)執(zhí)行指令


    image.png

指針寄存器EIP(extended 寄存器 instruction pointer指針)

指針寄存器粉捻,期內(nèi)存放著一個指針礁遣,該指針永遠指向下一條等待執(zhí)行的指令地址。
函數(shù)調用完畢后肩刃,返回原來函數(shù)指令運行的一個關鍵操作是祟霍,將棧幀中保持的返回地址裝入EIP寄存器。
控制了EIP寄存器就相當于控制了進程盈包,我們讓EIP指向哪里沸呐,CPU就會去執(zhí)行哪里的指令。


image.png

image.png

之所以將ESP值裝入EBP是因為新的棧幀是位于舊的棧幀上面呢燥,所讓舊的棧幀的頂部ESP成為新的棧幀的底部EBP

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崭添,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叛氨,更是在濱河造成了極大的恐慌呼渣,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寞埠,死亡現(xiàn)場離奇詭異每强,居然都是意外死亡,警方通過查閱死者的電腦和手機芯勘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門滑频,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怖糊,你說我怎么就攤上這事帅容。” “怎么了伍伤?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵并徘,是天一觀的道長。 經(jīng)常有香客問我扰魂,道長麦乞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任劝评,我火速辦了婚禮姐直,結果婚禮上,老公的妹妹穿的比我還像新娘蒋畜。我一直安慰自己声畏,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著插龄,像睡著了一般愿棋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上均牢,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天糠雨,我揣著相機與錄音,去河邊找鬼徘跪。 笑死见秤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的真椿。 我是一名探鬼主播鹃答,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼突硝!你這毒婦竟也來了测摔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤解恰,失蹤者是張志新(化名)和其女友劉穎锋八,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體护盈,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡挟纱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腐宋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片紊服。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胸竞,靈堂內(nèi)的尸體忽然破棺而出欺嗤,到底是詐尸還是另有隱情,我是刑警寧澤卫枝,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布煎饼,位于F島的核電站,受9級特大地震影響校赤,放射性物質發(fā)生泄漏吆玖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一马篮、第九天 我趴在偏房一處隱蔽的房頂上張望沾乘。 院中可真熱鬧,春花似錦积蔚、人聲如沸意鲸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎顾。三九已至,卻和暖如春漱贱,著一層夾襖步出監(jiān)牢的瞬間槐雾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工幅狮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留募强,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓崇摄,卻偏偏與公主長得像擎值,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逐抑,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351