程序鏈接與裝載

   程序的運行需要運行環境支撐,其運行環境一般由內存、運行庫和系統調用構成。其中系統調用部分程度上充當的是程序與內核進行交互的中介。其中首先需明白,程序與內存關係。內存是承載程序運行的介質,也是程序進行各種運算和表達的場所。

   window在默認情況下會將高地址的(2g)空間分配給內核(4g內存情況下),而Linux默認情況下將高地址的1g空間分配給內核。用戶則只能使用剩下的2g或者3g內存空間。在用戶空間中,存在以下“默認”的“區域

 *棧--用於維護函數調用的上下文,其通常在用戶空間的最高地址處分配,通常具有數兆字節大小

*堆--堆是用來容納應用程序動態分配的內存區域,,當程序使用malloc或new分配內存時,其得到內存則由堆分配。堆一般位於棧的下方(低地址方向),在某些時候,堆也可能沒有固定統一的存儲區域。堆一般比棧大很多,可以有幾十到數百兆的容量。

*可執行文件映像--存儲着可執行文件在內存的映像。由裝載器在裝載時將可執行文件的內存讀取或者映射到此處

*保留區--並不是一個單一的內存區域,而是在內存中受到保護而禁止訪問的區域的總稱。比如,在大多數的操作系統中,極小的地址是不允許訪問的如NULL,一般的C語言無效指針賦值爲0也是出於這個原因,因爲在正常情況下0地址上不可能保存有效的可訪問數據。

給出一個Linux典型的內存佈局


圖中的“動態鏈接庫映射區”用於映射裝載的動態鏈接庫。在Linux系統下,如果可執行文件依賴其他共享庫,那麼系統就會認爲它在從0x40000000開始的地址分配相應的空間,並將共享庫載入到該空間。

圖中的箭頭表明了其中大小可變區的尺寸增長方向,由圖可知,棧向低地址增長,堆向高地址增長。當堆或棧現有的大小不夠用時,會按照圖中增長方向擴大自己大小,直到預留空間被用完


本博文參考:程序員的自我修養--鏈接-裝載與庫。歡迎大家批評交流


發佈了18 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章