Linux內存管理 一

1.Linux內核爲每個進程提供了一個獨立的虛擬地址空間,這個虛擬地址空間是連續的。

虛擬地址空間被分爲內核空間和用戶空間,在32位系統中,虛擬地址空間一共有4GB的大小。內核空間佔1G(位於最高處),用戶空間佔3G。

進程在用戶態時只可以訪問用戶空間,在進入內核態之後纔可以訪問內核空間內存。每個進程的虛擬地址空間都包含了內核空間,他們對應的是同一塊物理內存。

 

一個可執行程序在沒用調入內存時存儲時分爲代碼段(.text)、數據段(.data)、爲初始化數據段(.bss)

  • .text段  是存放cpu執行的指令代碼。通常.text段是共享的,會把局部變量的定義存放在.text中,可執行可讀不可寫。
  • .data段 存放初始化不爲0 的全局變量和靜態的局部變量,可讀可寫不可執行,rodata段也屬於data段,存放着常量字符串,只可讀不可寫  即char *p = "hello"; 修改 *p 會報錯。
  • .bss段  存放的數據是爲初始化或初始化爲0的全局變量和局部變量,可讀可寫不可執行,在bss存放的數據在程序開始執行以前被初始化爲0或NULL

代碼區所在的地址空間最低,往上依次是.data,.bss

可執行的程序在運行的時候多出來了兩個區域:棧段(Stack) 和  堆段(Heap)

  • Stack 由系統進行開闢和釋放,存放函數的參數值和局部變量、臨時變量,函數調用的上下文,棧的大小是固定的連續的內存區域從高地址向低地址增長 一般是8MB。
  • Heap 進程運行的時候被動態分配出來的內存,由用戶自己管理 申請 malloc() 或者 mmap() 與 釋放 free(),由低地址像高地址增長
  • 文件映射段 包括動態庫、共享內存。  從高地址像低地址增長
 
#include<stdio.h>
 
int gdata1 = 10;  //.data  
int gdata2 = 0;   //.bss   
int gdata3;       //.bss
static int gdata4 = 20;  //.data
static int gdata5 = 0;   //.bss
static int gdata6;       //.bss
 
int main()
{
    //普通局部變量是指令
	int data7 = 30;  //.text
	int data8 = 0;  //.text
	int data9;      //.text

	static int data10 = 40; //.data
	static int data11 = 0;  //.bss
	static int data12;      //.bss
 
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章