32bit的linux系統記憶體分佈

L小小园發表於2024-05-26

32bit的linux系統記憶體分佈

在32bit的linux系統,則每個執行的程式都會得到4G大小的記憶體空間,只不過每個程式得到的4G大小的記憶體都是虛擬記憶體,而實體記憶體才只有4G,實體記憶體是真實存在的,而虛擬記憶體是透過對映得到的。(如圖所示一個程式有1M大小的實體記憶體,在執行之後會得到4G大小的虛擬記憶體空間。

img


1、程式碼段:(1).text段:用於儲存使用者程式生成的指令。

​ (2).init段:用於儲存系統初始化的指令。

注意:這兩部分的屬性是只讀的,在程式執行之後程式碼段中的資料就不應該再被修改。在程式執行之前 程式碼段的記憶體空間就已經被核心計算完成。


2、資料段:(1).rodata段:被稱為只讀常量區,程式中的常量(整型常量、字串常量)都是儲存在該區域,對於 該區域的屬性是隻讀的,當程式結束後該區域的記憶體會被釋放。

​ (2).data段:用於儲存程式中的已經被初始化的全域性變數已經被初始化的靜態區域性變數,另外注意初 始化的值不能為0!

​ (3).bss段:用於儲存程式中未被初始化的全域性變數以及未被初始化的靜態區域性變數以及初始化為0的 全域性變數初始化為0的靜態區域性變數


3、堆記憶體:堆空間屬於使用者可以隨意支配的記憶體,使用者想要支配堆空間的記憶體的前提是需要向核心申請,可以透過庫 函式malloc( )、calloc( )申請堆記憶體,注意堆空間需要使用者手動申請以及手動進行釋放,透過庫函式free( )釋放堆記憶體。堆記憶體屬於匿名記憶體,只能透過指標訪問!!!

注意由於堆空間是由使用者進行支配,所以使用者申請成功之後,使用完成後需要及時釋放堆空間,並且必 須手動釋放,並且必須只能釋放一次,如果不釋放,則會導致記憶體洩漏! 另外,當把申請的堆內 存釋放之後,則應該同樣把指向堆記憶體首地址的指標的地址指向NULL


4、棧空間:棧空間主要用於儲存程式的命令列引數、區域性變數、函式的引數值、函式的返回地址,當函式被呼叫期 間,核心會分配對應大小的棧空間給函式使用,當函式呼叫完成則棧空間就會核心釋放。棧空間的記憶體存 儲是隨機值,所以使用者得到棧空間之後,應該把變數進行初始化,目的是防止變數中儲存的值是不確定 的。

注意Linux系統中棧空間的容量是有限的,如果超過容量,則會發生棧溢位,導致程式出現段錯誤


相關文章