1. 程式人生 > >4G虛擬地址空間分配

4G虛擬地址空間分配

虛擬地址的分配:

Linux:使用者空間:核心空間 = 3:1

windows:使用者空間:核心空間 = 2:2(虛擬地址低空間,即從0x00000000~0X7FFFFFFF的2GB為使用者空間,而高地址0x80000000~0xFFFFFFFF被分配給了系統核心。)

圖下研究的為Linux下的4G虛擬空間



接下來我們從上至下依次解釋一下這些:

 3G使用者空間:

1、保留區

保留區128M,我們通常將申請的臨時指標變數初始化時置為NULL,可以防止後續無意使用這個指標出錯,因為NULL == 0x0,將其指標指向0x0這個地址時,因為0x0這個地址屬於保留區,沒有訪問許可權的。

2、.text段

指令段:通常是指用來存放程式執行程式碼的一塊記憶體區域。這部分割槽域的大小在程式執行前就已經確定,並且記憶體區域通常屬於只讀, 某些架構也允許程式碼段為可寫,即允許修改程式。在程式碼段中,也有可能包含一些只讀的常數變數,例如字串常量等。

3、.data段

資料段(data segment)通常是指用來存放程式中已始化且不為0的全域性變數和靜態變數的一塊記憶體區域。資料段屬於靜態記憶體分配。常量也放在這個區域。

4、.bss段

資料段:(Bss Segment)通常是指用來存放程式中未初始化或者初始化為0的全域性變數的一塊記憶體區域,在程式載入時由核心清0。bss段屬於靜態記憶體分配。

PS:.data段與.bss段的區別(為什麼有兩個資料段)
   
  1) BSS段不佔用物理檔案尺寸,但佔用記憶體空間;資料段佔用物理檔案,也佔用記憶體空間。所以有兩個資料段節省檔案空間。
     對於大型陣列如int ar0[10000] = {1, 2, 3, ...}和int ar1[10000],ar1放在BSS段,只記錄共有10000*4個位元組需要初始化為0,而不是像ar0那樣記錄每個資料1、2、3...,此時BSS為目標檔案所節省的磁碟空間相當可觀。
     2) 當程式讀取資料段的資料時,系統會出發缺頁故障,從而分配相應的實體記憶體;當程式讀取BSS段的資料時,核心會將其轉到一個全零頁面,不會發生缺頁故障,也不會為其分配相應的實體記憶體。

5、heap

 堆:一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回收

儲存函式內部動態分配記憶體,是另外一種用來儲存程式資訊的資料結構,更準確的說是儲存程式的動態變數。堆是“先進先出”資料結構。它只允許在堆的一端插入資料,在另一端移走資料。堆的地址空間“向上增加”,即當堆上儲存的資料越多,堆的地址就越高。

6、共享庫

在編寫程式時,會依靠其他人已經寫好的許多程式碼來執行例程或特殊功能。 這些程式碼儲存在共享庫中使用它們,需要將它們與自己的程式碼相連結,無論是在構建程式時還是在執行程式時。

7、stack

棧:棧(stack)
      棧,由編譯器自動分配釋放,行為類似資料結構中的棧(先進後出)。
     堆疊主要有三個用途:
     ①函式的返回地址(以便從被呼叫者返回)和引數
     ②臨時變數:包括函式的非靜態區域性變數以及編譯器自動生成的其他臨時變數
     ③儲存上下文:包括在函式呼叫前後需要保持不變的暫存器

8、命令列引數

     C語言中有關命令列引數涉及到程式的主函式main(int argc,char *argv[])這樣兩個引數,其中,int argc表示命令列引數的個數(包括可執行程式名本身),char *argv[]表示每個引數的具體內容,argv[0]為命令列中可執行程式名本身,argv[1]為命令列中第二個引數的內容,依次類推。

9、環境變數

    例:int execve(char *pathname,char* argv[],char*envp[])  ,char*envp就是所謂的環境變數

     環變數是一個具有特定名字的物件,它包含了一個或者多個應用程式所將使用到的資訊。許多使用者(特別是那些剛接觸Linux的新手)發現這些變數有些怪異或者難以控制。其實,這是個誤會:通過使用環境變數,你可以很容易的修改一個牽涉到一個或多個應用程式的配置資訊。

核心空間:

作用:Linux 作業系統和驅動程式執行在核心空間

實體地址 = 邏輯地址 – 0xC0000000:這是核心地址空間的地址轉換關係,注意核心的虛擬地址在“高階”,但是ta對映的實體記憶體地址在低端。

核心記憶體分配:

在x86結構中,三種類型的區域(從3G開始計算)如下:

ZONE_DMA               16MB

ZONE_NORMAL       892MB

ZONE_HIGHMEM      128MB