很多人接觸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文章
11345瀏覽量
210378 -
內存
+關注
關注
8文章
3055瀏覽量
74325 -
C語言
+關注
關注
180文章
7614瀏覽量
137702 -
函數
+關注
關注
3文章
4346瀏覽量
62968
發布評論請先 登錄
相關推薦
鴻蒙內核源碼分析:物理地址的映射
操作系統中的邏輯地址和物理地址
請問ARM虛擬地址 物理地址 加載地址 運行地址的聯系是什么?
為什么MMU的地址映射中物理地址會跳變?
【HarmonyOS】虛擬地址<->物理地址是如何映射的
物理地址到虛擬地址的轉換步驟
linux kernel實現物理地址到虛擬地址空間的切換方法
鴻蒙內核中虛擬地址與物理地址之間是如何映射的
![鴻蒙內核中<b class='flag-5'>虛擬地址</b>與<b class='flag-5'>物理地址</b>之間是如何映射的](https://file.elecfans.com/web1/M00/CF/F3/o4YBAF-2EfGAYoeDAAIkPxt0ncs225.png)
虛擬地址物理地址等眾多地址及MMU相關知識
![<b class='flag-5'>虛擬地址</b><b class='flag-5'>物理地址</b>等眾多<b class='flag-5'>地址</b>及MMU相關知識](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
虛擬地址翻譯物理地址的流程有哪些呢?
![<b class='flag-5'>虛擬地址</b>翻譯<b class='flag-5'>物理地址</b>的流程有哪些呢?](https://file1.elecfans.com/web2/M00/90/66/wKgaomTZkmaAE7HrAAApSCM4cBA292.png)
Linux系統為什么需要引入虛擬地址
![<b class='flag-5'>Linux</b>系統為什么需要引入<b class='flag-5'>虛擬地址</b>](https://file1.elecfans.com/web2/M00/A6/F0/wKgaomUhIiWAXCaHAABZmVGuc74743.jpg)
評論