很多人接觸Linux的內存管理是從malloc()這個C語言庫函數開始,也是從那時開始就知道了虛擬內存的概念。但很多人可能并不知道虛擬地址是如何轉換成物理地址的,今天帶你搞懂虛擬地址到物理地址的轉換過程,這其實也是MMU的工作原理。
我們知道,在Linux中,每個進程都有自己獨立的地址空間,且互不干擾。每個進程的地址空間又分為用戶空間和內核空間,但這些地址空間使用的都是虛擬地址,它們和物理地址空間關系是怎樣的呢?虛擬地址空間和物理地址空間的關系如下:
對于不同的進程,面對的都是同一個內核,其內核空間的地址對應的物理地址都是一樣的,因此進程1和進程2中內核空間都映射到了相同的物理內存PA1上。
而不同進程的用戶空間是不一樣的,即便相同的虛擬地址,也會被映射到不同的物理地址上。如圖中兩個進程相同用戶空間的地址0x123456分別被映射到了PA2和PA3物理地址上。
那么如何完成上述虛擬地址到物理地址的轉換呢?
完成虛擬地址到物理地址的轉換,我們需要借助一個硬件——MMU。
MMU: Memory manager unit,內存管理單元,負責將虛擬地址(VA)轉為物理地址(PA)。
分頁機制
在Linux系統上,現在用到的內存管理機制,大部分是分頁機制。在分頁機制出現之前,還出現過動態分區法、分段機制。
動態分區法是還沒用引入虛擬地址之前使用的,使用的都是物理內存,屬于非常早期的機制。分段機制則引入了虛擬地址的概念,而分頁機制在分段機制后出現,主要解決分段機制內存碎片的問題。本篇以分頁機制講解虛擬地址到物理地址的轉換,下面介紹分頁機制的一些基本概念。
分頁機制的基本概念:
分頁:將內存劃分為固定長度的單元,每個單元就是一頁
頁:對于虛擬地址空間,將地址空間劃分為固定大小單元的單元,每個單元稱為一頁
頁幀:對于物理地址空間,將地址空間分為固定大小的單元,每個單元稱為頁幀
VPN:Virtual Page Number,虛擬頁面號
PFN:Physical Frame Number,物理頁幀號
分頁管理內存的核心問題就是虛擬地址頁到物理地址頁幀的映射關系
-
Linux
+關注
關注
87文章
11304瀏覽量
209523 -
內存
+關注
關注
8文章
3025瀏覽量
74056 -
C語言
+關注
關注
180文章
7604瀏覽量
136841 -
函數
+關注
關注
3文章
4331瀏覽量
62622
發布評論請先 登錄
相關推薦
評論