記憶體管理之使用者空間

2021-08-13 08:06:12 字數 3042 閱讀 6080

32 位的平台上,線性位址空間為固定的 4gb,並且由於採用了保護機制,linux核心將這 4gb 分為兩部分,線性位址較高的 1gb(0xc0000000 到 0xffffffff )為共享的核心空間;而較低的 3gb 為每個程序的使用者空間。由於每個程序都不能直接訪問核心空間,而是通過系統呼叫間接進入核心,因此所有的程序都共享核心空間。而每個程序都擁有各自的使用者空間,各個程序之間不能互相訪問彼此的使用者空間。

乙個程序的使用者位址空間主要由兩個資料結構來描述。乙個是 mm_struct 結構,它對程序的整個使用者空間進行描述,簡稱記憶體描述符;另乙個是 vm_area_struct 結構,它對使用者空間中各個區間( **區、資料區等 )進行描述。

記憶體描述符

每個程序只有乙個mm_struct結構,在每個程序的task_struct結構中,有乙個指向該結構的指標。

struct mm_struct ;
mmap_cache 指向虛擬區間, 根據區域性性原理,最近一次用到的虛擬區間很可能下一次還要用到,因此把最近用到的虛區間放到快取記憶體

pgd 指向該程序的頁目錄,當排程程式排程乙個程式執行時就將這個位址轉換成實體地址並寫入cr3

page_table_lock 和 mmap_sem 提供互斥操作

還有**段、資料段等的起始位址和結束位址。

虛擬記憶體區域( vma )

虛擬記憶體區域由vm_area_struct結構體描述,每一塊虛擬記憶體區都是由連續的虛擬位址組成。每個vm_area_struct代表了不同的記憶體區域。

struct vm_area_struct ;
為什麼要劃分出區間?因為每個虛存區可能**不同,有的可能來自於可執行檔案,有的可能來自共享庫,有的可能是動態分配的記憶體區,對不同的虛存區可能有不同的訪問許可權,也可能有不同的操作。因此linux將程序的使用者空間分割管理,並利用虛存區處理函式( vm_ops )來抽象對不同**虛存區的處理方法。物件導向的思想,相當於class了乙個物件表示虛存區,有屬性,有操作。

struct vm_operations_struct
vm_ops 結構中包含的是函式指標,nopage()是當虛存頁面不在物理記憶體而引起的缺頁異常時所應該呼叫的函式。

相關資料結構之間的關係

檢視程序記憶體空間

cat /proc//maps

就是遍歷 struct vm_area_struct *mmap 單鏈表。

乙個程式編譯鏈結之後形成的位址空間是乙個虛擬位址空間,但是程式程式最終還是要執行在物理記憶體中,所以應用程式訪問乙個虛擬位址時,需要將虛擬位址轉換為實體地址,然後處理器才能解析位址訪問請求,這個轉換工作通過查詢頁表來完成。每個程序的記憶體描述符儲存了這個程序頁表指標 pgd,每一塊虛擬記憶體頁都和頁表的某一項對應。

乙個虛擬記憶體 vm_area_struct 塊是由連續的虛擬記憶體頁組成,但是這些虛擬記憶體頁對映的物理記憶體卻不一定是連續的,如下圖:

有三個頁對映到物理記憶體,還有兩個頁沒有對映,所以常駐記憶體 rss 為 12kb,虛擬記憶體區大小為 20kb。對於有對映到物理記憶體的三個頁頁表項 pte 的 present 標誌設為 1,而沒有對映的兩個虛擬記憶體頁表項的 present 位清除,所以訪問那兩塊記憶體時會導致缺頁異常。

當應用程式申請記憶體或者檔案對映時,核心先響應這個請求,分配或更新虛擬記憶體;但是這些虛擬記憶體並沒有對映到真正的物理記憶體,即核心總是盡量延後分配物理記憶體,使用者程序總是先獲得乙個虛擬記憶體區的使用權,只有等到訪問這塊記憶體時,通過缺頁異常獲得真正的物理記憶體。它會告訴核心真正的為程序分配物理頁,並建立對應的頁表。

在呼叫 fork() 系統呼叫建立乙個新程序時就為這個程序建立了乙個完整的使用者空間。

簡單的說在建立的過程中所做的工作是 mm_struct 結構的建立、vm_area_struct 結構的建立以及頁目錄和頁表的建立。並沒有真正地複製乙個物理頁面,這也是為什麼 linux 核心能迅速建立程序的原因之一。

linux並不將可執行映像裝入到物理記憶體,相反,可執行檔案只是被裝載到程序的使用者空間中。當呼叫 exec() 系統呼叫開始執行乙個程序時,程序的可執行映像被裝入到程序的使用者位址空間,如果還用到任何乙個共享庫,那麼共享庫頁必須裝入到程序的使用者空間。隨著程序的執行,被引用的程式部分會由作業系統裝入到物理記憶體,這種將映像對映到程序使用者空間的方法被稱為「虛存對映」,也就是把檔案從磁碟對映到程序的使用者空間,這樣把對檔案的訪問轉化為對虛存區的訪問。

有兩種型別的虛存對映:

共享的:有幾個程序共享這一對映,如果乙個程序對共享的虛存區進行寫,其他程序都能感覺到,而且會修改磁碟上對應的檔案。

私有的:程序建立的這種對映只是為了讀檔案,對虛存區的寫操作不會修改磁碟上的檔案。

如果對映與檔案無關,就叫匿名對映,比如堆和棧。

當可執行映像對映到程序的使用者空間時,將產生一組 vm_area_struct 結構來描述各個虛擬區間的起始點和終止點,每個 vm_area_struct 結構代表可執行映像的一部分。

乙個程序基本上可以分為如下幾種 vma 區域:

ubuntu之 使用者管理

n 新建使用者 user add useradd username 新建使用者後,會在 home目錄下建立乙個以username命名的資料夾,使用者每次登入時自動定位到該資料夾下。為使用者新增密碼 password passwd username 刪除使用者 user delete userdel ...

Linux之使用者管理

1 建立computer使用者組,該組下面建立16級計科班使用者10個學生使用者和密碼,分別登入自己對應目錄,通過命令驗證 2 建立一使用者登入,改變預設目錄home,登入目錄為 xcu computer下,字元介面顯示使用者名稱資訊。3 建立lijia1,lijia2,lijia3三個使用者,在字...

Oracle之使用者管理

1.要想建立使用者,需要管理員登入,以下操作在sys下操作 2.建立使用者 create user 使用者名稱 identityfy by 密碼 列子 3.新建立的使用者不具備任何許可權,如果要想獲取登入許可權,可以使用下面的語法 grant 許可權 1,許可權2,to 使用者名稱 列子 4.建立序...