Linux 虛擬記憶體,使用者空間,核心空間

2021-06-22 19:48:25 字數 1192 閱讀 9944

linux虛擬記憶體的大小為2^32(在32位的x86機器上),核心將這4g位元組的空間分為兩部分。最高的1g位元組(從虛位址0xc0000000到0xffffffff)供核心使用,稱為「核心空間」。而較低的3g位元組(從虛位址0x00000000到0xbfffffff),供各個程序使用,稱為「使用者空間」。因為每個程序可以通過系統呼叫進入核心,因此,linux核心空間由系統內的所有程序共享。於是,從具體程序的角度來看,每個程序可以擁有4g位元組的虛擬位址空間(也叫虛擬記憶體).

每個程序有各自的私有使用者空間(0~3g),這個空間對系統中的其他程序是不可見的。最高的1gb核心空間則為所有程序以及核心所共享。另外,程序的「使用者空間」也叫「位址空間」,在後面的敘述中,我們對這兩個術語不再區分。

使用者空間不是程序共享的,而是程序隔離的。每個程序最大都可以有3gb的使用者空間。乙個程序對其中乙個位址的訪問,與其它程序對於同一位址的訪問絕不衝突。比如,乙個程序從其使用者空間的位址0x1234abcd處可以讀出整數8,而另外乙個程序從其使用者空間的位址0x1234abcd處可以讀出整數20,這取決於程序自身的邏輯。

任意乙個時刻,在乙個cpu上只有乙個程序在執行。所以對於此cpu來講,在這一時刻,整個系統只存在乙個4gb的虛擬位址空間,這個虛擬位址空間是面向此程序的。當程序發生切換的時候,虛擬位址空間也隨著切換。由此可以看出,每個程序都有自己的虛擬位址空間,只有此程序執行的時候,其虛擬位址空間才被執行它的cpu所知。在其它時刻,其虛擬位址空間對於cpu來說,是不可知的。所以儘管每個程序都可以有4 gb的虛擬位址空間,但在cpu眼中,只有乙個虛擬位址空間存在。虛擬位址空間的變化,隨著程序切換而變化。

從上面我們知道,乙個程式編譯連線後形成的位址空間是乙個虛擬位址空間,但是程式最終還是要執行在物理記憶體中。因此,應用程式所給出的任何虛位址最終必須被轉化為實體地址,所以,虛擬位址空間必須被對映到物理記憶體空間中,這個對映關係需要通過硬體體系結構所規定的資料結構來建立。這就是我們所說的段描述符表和頁表,linux主要通過頁表來進行對映。

於是,我們得出乙個結論,如果給出的頁表不同,那麼cpu將某一虛擬位址空間中的位址轉化成的實體地址就會不同。所以我們為每乙個程序都建立其頁表,將每個程序的虛擬位址空間根據自己的需要對映到實體地址空間上。既然某一時刻在某一cpu上只能有乙個程序在執行,那麼當程序發生切換的時候,將頁表也更換為相應程序的頁表,這就可以實現每個程序都有自己的虛擬位址空間而互不影響。所以,在任意時刻,對於乙個cpu來說,只需要有當前程序的頁表,就可以實現其虛擬位址到實體地址的轉化。

虛擬記憶體,核心空間和使用者空間

linux簡化了分段機制,使得虛擬位址與線性位址總是一致的。線性空間在32為平台上為4gb的固定大小,也就是linux的虛擬位址空間也這麼大,linux核心將這4gb的空間分為兩個部分。最高的1gb 從虛擬位址0xc0000000到0xffffffff 供核心使用,稱為 核心空間 而較低的3gb 從...

虛擬記憶體,虛擬位址空間,使用者空間,核心空間

虛擬記憶體,就是用磁碟作為介質,暫時性儲存資料,和主存進行換入換出,使程式能夠使用更多的記憶體。虛擬記憶體是單位是頁,固定大小的資料方便資料的交換。如果乙個應用程式要訪問某段記憶體,通過mmu得到相應的頁號,然後就去主存中去尋找相應的頁,如果該頁被換到了磁碟上,就會發生乙個缺頁,然後核心就會從磁碟上...

Linux 分配虛擬記憶體(swap空間)

1.首先用命令free檢視系統內 swap 分割槽大小。free m total used free shared buffers cached mem 1002 964 38 0 21 410 buffers cache 532 470 swap 951 32 929 可以看到 swap 只有95...