linux簡化了分段機制,使得虛擬位址與線性位址總是一致的。線性空間在32為平台上為4gb的固定大小,也就是linux的虛擬位址空間也這麼大,linux核心將這4gb的空間分為兩個部分。最高的1gb(從虛擬位址0xc0000000到0xffffffff)供核心使用,稱為「核心空間「。而較低的3gb(從虛擬位址0x00000000到0xbfffffff),供各個程序使用,稱為「使用者空間」,因為每個程序可以通過系統呼叫進入核心,因此,linux核心空間由系統內的所有程序共享。所以,每個程序可以擁有4gb的虛擬位址空間(也叫虛擬記憶體)。每個程序有各自的私有使用者空間(0~3gb),這個空間對系統中的其他程序是不可見的。最高的1gb核心空間則為所有程序以及核心所共享(雖然共享,但是乙個完整的虛擬位址空間就是4gb,核心空間是每個程序都要被分配的,只是他們對應相同的位址空間)。
1、從0×00000000到0xbfffffff的線性位址,無論程序執行在使用者態還是核心態都可以定址。
2、從0xc0000000到0xffffffff的線性位址,只有核心態的程序才能定址。
使用者空間不是被程序共享的,而是被程序隔離的。每個程序最大可以有3gb使用者空間。所以說乙個程序對乙個位址的訪問,與另乙個程序對同乙個位址的訪問不衝突,因為儘管是同乙個位址但因為,程序的使用者空間不共享 導致他們其實並沒有指向同乙個位址。而對於cpu來講,在任意的時刻,整個系統都只有4gb的虛擬位址空間,這個虛擬空間是面向程序的,所以當程序切換的時候,虛擬位址空間也會切換。所以只有此程序執行的時候,其虛擬位址空間才被cpu所知。其他時刻,其虛擬空間不被cpu所知。
乙個程式編譯鏈結後形成的是虛擬位址空間,而程式最終要執行在物理記憶體中。所以,虛擬位址空間必須被對映到物理記憶體空間中,這個對映關係需要通過硬體體系結構所規定的資料結構來建立。即段描述符表和頁表,而linux主要通過頁表來進行對映。
由以上得出乙個結論。如果給出的頁表不同,那麼cpu將某一虛擬位址空間中的位址轉化成的實體地址也不同,所以每個程序都建立了頁表,將每個程序的虛擬位址空間根據自己的需要對映到實體地址空間上。既然在乙個時刻cpu上只能有乙個程序在執行,那麼當程序發生切換時,將頁表也更換為相應程序的頁表,這就可以實現每個程序都有自己的虛擬位址空間而互不影響。
核心空間到物理空間記憶體的對映
核心空間佔據了每個虛擬空間中的最高1gb,但對映到物理記憶體卻總是從最低的位址(0x00000000)開始的,所以3gb(0xc0000000)就是實體地址與虛擬位址之間的位移量,而在linux**中就叫做page_offset。
# define _page_dffset (0xc0000000)
#define page_offset ((unsigner long) __page_offset)
#define _pa(x) (unsigned long) (x) - page_offset
#define _va(x) ((void *) ((unsigned long) (x) + page_offset))
對於核心空間而言,給定乙個虛位址x,其實體地址為x-page_offset,給定乙個實體地址x,其虛位址為x+page_offset。
這只適合核心空間的虛位址對映到實體地址,而絕不適用於使用者空間。
Linux 虛擬記憶體,使用者空間,核心空間
linux虛擬記憶體的大小為2 32 在32位的x86機器上 核心將這4g位元組的空間分為兩部分。最高的1g位元組 從虛位址0xc0000000到0xffffffff 供核心使用,稱為 核心空間 而較低的3g位元組 從虛位址0x00000000到0xbfffffff 供各個程序使用,稱為 使用者空間...
虛擬記憶體,虛擬位址空間,使用者空間,核心空間
虛擬記憶體,就是用磁碟作為介質,暫時性儲存資料,和主存進行換入換出,使程式能夠使用更多的記憶體。虛擬記憶體是單位是頁,固定大小的資料方便資料的交換。如果乙個應用程式要訪問某段記憶體,通過mmu得到相應的頁號,然後就去主存中去尋找相應的頁,如果該頁被換到了磁碟上,就會發生乙個缺頁,然後核心就會從磁碟上...
linux記憶體管理 使用者空間和核心空間
關於虛擬記憶體有三點需要注意 上圖展示了整個程序位址空間的分布,其中4g的位址空間分為兩部分,在使用者空間內,對應了記憶體分布的五個段 資料段 段 bss段 堆 棧。在上篇文章中有詳細的介紹。這個圖示核心使用者空間的劃分,圖中最重要的就是高階記憶體的對映 其中kmalloc和vmalloc函式申請的...