必會1 進程虛擬地址空間區域的劃分

進程虛擬地址空間區域的劃分

任何編程語言 -> 產生兩種東西:指令和數據

所以我們瞭解指令和數據的存放方式是很有必要的!

進程的虛擬空間劃分

環境

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

每一個進程的用戶空間是私有的(別的程序不可訪問),但是內核空間是共享的(所有程序都可以訪問同樣的內核空間)!!!

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