linux(3)程序的位址空間

2021-09-25 13:27:11 字數 1408 閱讀 5028

在c語言剛入門的時候我們曾經見過這乙個

當時我們認為這就是記憶體,但是今天我們要推翻這個結論,它的真實名字叫程序的位址空間。我們對位址空間先描述再組織,它是乙個結構體存在很多的區間,通過調節區間的開始值和結束值來管理虛擬位址。

執行如下**

#include #include #include using namespace std;

int main()

{ int f = 100;

pid_t id = fork();

if(id == 0)

{

cout<0)

{

f = 200;

cout執行結果如下

很明顯,他們的顯示的位址相同,但是真實的值不同,可以確定的是,這個位址並不是資料儲存的真實位址,而是虛擬位址。

實際上虛擬位址和實體地址的關係如下

有父子關係的程序有相同的虛擬地,在通過頁表的對映和硬體mmu的管理下,確定物理記憶體的位址。

需要注意的頁表通過分級頁表節省空間

通常在32位的位址中系統會將其分為三部分,將32個位元位分為10,10,12的部分,所以理論上有2^10個一級頁表,已經之上的二級頁表,和最終4k大小的**頁表,一級頁表是存在的,但是二級頁表會根據情況來確定是否存在,**頁表也是如此,節省了空間。

級頁表是基於虛擬位址的分段來劃分等級的,最低等級的頁表上儲存了最終的虛擬頁號和物理頁號的對應關係。

例如拿32位的虛擬位址來說,如果頁面的大小為4k,也就是12位,那麼位址空間內將有20位,也就是1m的頁表專案,每個專案對應乙個虛擬頁面。

那麼對於位址空間中用於表示頁號的20位位址再次分級,分成10位的一級頁號和10位的二級頁號呢

也就是說根據一級頁號可以知道1k個連續的頁面中是否已經有被載入到記憶體或者被置換到交換空間中的,如果一級頁表中這1k個頁面沒有任意乙個頁面被載入或者置換郭,那麼就不需要在為這1k個頁面維護2級頁表了。

理論上來說,乙個程序開始執行的時候只需要3個1k的頁面就可以執行了,即一k的**段頁面,一k的資料段頁面和一k的桟頁面。因此,只需要1k個一級頁表單元一級3k個二級頁表單元即可,遠遠小於連續頁面型別的頁表需要的1m的頁表單元

這麼做的好處如下:

可以防止某些惡意程序對物理記憶體進行破壞

每乙個程序都認為自己獨佔記憶體資源便於管理

linux 程序位址空間

乙個linux程序的虛擬位址空間分布如下圖所示,分為使用者空間和核心空間,對於乙個32位作業系統來說,4gb的空間分成兩部分,低位址的0 3g給使用者空間,高位址的3g 4g給核心空間 2.1 唯讀資料段 rodata,又叫做常量資料段 存放唯讀資料 字串常量和const修飾的全域性變數 const...

Linux程序位址空間

我們知道,在32位機器上linux 作業系統中的程序的位址空間大小是4g,其中0 3g是使用者空間,3g 4g是核心空間。其實,這個4g的位址空間是不存在的,也就是我們所說的虛擬記憶體空間。c程式一直由下列幾部分組成 a.正文段。這是由cpu執行的機器指令部分。通常,正文段是可共享的,所以即使是經常...

Linux 程序位址空間 簡介

程序虛擬位址空間是linux的乙個重要抽象,系統為每乙個執行的linux程序提供了4gb的虛擬位址空間,程序之間不會相互干擾,僅能訪問自己的虛擬位址空間位址。linux程序的虛擬位址空間分為user和kernel兩個部分,0 3g是為程序的user位址空間,3g 4g為kernel位址空間。此外程序...