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;
}