程序虛擬位址為什麼是4G大小?

2021-08-29 04:09:43 字數 1005 閱讀 6102

1、建立乙個程序時,作業系統會為該程序分配乙個 4gb 大小的虛擬 程序位址空間。 之所以是 4gb ,是因為在 32 位的作業系統中,乙個指標長度是 4 位元組  (32位), 2的32次 方個位址定址能力是從 0x00000000~0xffffffff 即為 4gb 大小的容量。

4g 指的是最大的定址空間為4g

乙個程序用到的虛擬位址是由記憶體區域表來管理的,實際用不了4g。而用到的記憶體區域,會通過頁表對映到物理記憶體。所以每個程序都可以使用同樣的虛擬記憶體位址而不衝突,因為它們的實體地址實際上是不同的。
2、每個程序有4gb的虛擬記憶體空間,這是乙個概念上的東西,並不是實際上的分配。  當程式啟動並載入到記憶體中時,這裡的「記憶體」指的是虛擬記憶體,它由兩部分組成:硬碟上的頁交換檔案和實際的物理記憶體。 從執行的程式自身來看,程式中包含的**和資料可以存放在0~4gb的程序空間中的任何乙個位址上,而這個位址的值將由作業系統進行換算,並對映到實際的實體地址值上(包括硬碟上,或物理記憶體)中;其中,對於需要執行的程式的指令和資料將傳入物理記憶體,而對於暫時不用的指令和資料,作業系統將根據演算法,來決定是否將其暫時放在硬碟的頁交換區。 

3、每個程序只能訪問自己虛擬位址空間中的資料,無法訪問別的程序中的資料,通過這種方法實現了程序間的位址隔離。 程序a可以訪問它的位址空間0x11009333處的位址。程序b當然也有這個位址,但程序b的此位址處儲存的與程序a的資料完全不同。它們沒有任何關係。程序a不能訪問程序b的位址空間。否則a程序可以直接篡改b程序的資料了。

4、 這4g並不是全部給使用者使用:

①棧空間:特點是由系統管理,先進後出,裡面放了區域性變數、函式形參、自動變數。

②堆空間:特點是由使用者管理,先進後出,我們可以用malloc、ralloc、calloc來分配空間。

③資料段:資料段裡面又分三塊,第一塊是bss,儲存未初始化的全域性變數;第二塊是rodata,儲存了常量;第三塊  是.data(靜態資料區)儲存了初始化的全域性變數還有static修飾的變數。  

④**段:存放了源**。

4G虛擬位址空間

在linux系統中,使用者空間和核心空間所佔的比例為3 1 在windows系統中,使用者空間和核心空間所佔的比例為2 2 下面以linux系統為例 text 指令段,也叫 段,區域性變數也是指令,但區域性變數儲存在棧上,當 執行時才在棧中預留好的區域中開闢。data 資料段儲存 中的各種資料,包括...

程序的虛擬位址空間4G劃分

當乙個程 序執行的時候 而這4g也劃分成了兩大塊。第一塊1g要分給核心,我們使用者是看不見也進不去的。第二塊3g是給使用者使用的。就像地拿到手了,還要蓋房裝修,我們使用者拿到這3g也要做同樣的事,這3g也要分成好幾塊。3g 棧空間 特點是由系統管理,先進後出,裡面放了區域性變數 函式形參 自動變數。...

4G虛擬位址空間布局

一 其中,使用者程序部分分段儲存內容如下表所示 按位址遞增順序 名稱儲存內容 段 text 可執行 字串字面值 唯讀變數 資料段 data 已初始化且初始值為非0的全域性變數和靜態區域性變數 bss段 未初始化或初始值為0的全域性變數和靜態區域性變數 棧區域性變數 函式引數 返回位址等 堆動態分配的...