進程虛擬地址空間區域的劃分
任何編程語言 -> 產生兩種東西:指令和數據
所以我們瞭解指令和數據的存放方式是很有必要的!
進程的虛擬空間劃分
環境
x86 32位linux環境下,系統給進程分配一個4G的虛擬地址空間
(64位下,可以參考:https://blog.csdn.net/qq_28018113/article/details/73438094)
示例圖
各個段的說明
-
.text 指令段 只讀
-
.rodata 只讀數據段 char* p =“hello” hello 就在rodata
-
.data 數據段 初始化了的數據,且初始值不爲零
-
.bss 數據段 未初始化的數據,或初始化爲零的數據,系統會給這個段進行零初始化。存儲未初始化的全局變量 (不佔用程序文件的大小,但是佔用程序運行時的內存空間)
-
heap 堆 分配時從低地址到高地址
-
stack 棧 每個線程在當前進程空間中都會有私有的棧空間。地址空間從高地址到低地址增長
-
命令行參數 ./a.out 127.0.0.1 6000
-
ZONE_DMA 大概16M
-
ZONE_NORMAL 800多M 有進程控制塊PCB 內核棧空間
-
ZONE_HIGHMEM 高端內存
-
!全局變量會在符號表中生成符號
-
!局部變量不生產符號,生成指令 存放在.text
- int a = 12; mov dword ptr[a], 0Ch
-
!局部靜態變量存放在數據段,按照是否初始化,是否爲零分開存放。當程序運行到static int e = 13; 時才初始化。
示例代碼
#include<iostream>
int gdata1 = 10
int gdata2 = 0;
int gdata3;
static int gdata4 = 11;
static int gdata5 = 0;
static int gdata6;
int main()
{
int a = 12;
int b = 0;
int c;
static int e = 13;
static int f = 0;
static int g;
return 0;
}
數據類型 | 存放區域 | 舉例變量 |
---|---|---|
全局變量已初始化且不爲零 | .data | gdata1 |
全局變量已初始化且爲零 | .bss | gdata2 |
全局變量未初始化 | .bss | gdata3 |
全局靜態變量已初始化且不爲零 | .data | gdata4 |
全局靜態變量已初始化且爲零 | .bss | gdata5 |
全局靜態變量未初始化 | .bss | gdata6 |
局部變量 | 產生指令放在.text | a,b,c |
局部靜態變量已初始化且不爲零 | .data | e |
局部靜態變量已初始化且爲零 | .bss | f |
局部未初始化靜態變量 | .bss | g |