一步一圖帶你深入理解 Linux 虛擬內存管理

寫在本文開始之前....從本文開始我們就正式開啟了 Linux 內核內存管理子系統源碼解析系列,筆者還是會秉承之前系列文章的風格,采用一步一圖的方式先是詳細介紹相關原理,在保證大家清晰理解原理的基礎上,我們再來一步一步的解析相關內核源碼的實現 。有了源碼的輔證,這樣大家看得也安心,理解起來也放心,最起碼可以證明筆者沒有胡編亂造騙大家 , 哈哈~~
內存管理子系統可謂是 Linux 內核眾多子系統中最為復雜最為龐大的一個,其中包含了眾多繁雜的概念和原理,通過內存管理這條主線我們把可以把操作系統的眾多核心系統給拎出來,比如:進程管理子系統,網絡子系統,文件子系統等 。
由于內存管理子系統過于復雜龐大,其中涉及到的眾多繁雜的概念又是一環套一環 , 層層遞進 。如何把這些繁雜的概念具有層次感地,并且清晰地,給大家梳理呈現出來真是一件比較有難度的事情,因此關于這個問題,筆者在動筆寫這個內存管理源碼解析系列之前也是思考了很久 。
萬事開頭難,那么到底什么內容適合作為這個系列的開篇呢 ?筆者還是覺得從大家日常開發工作中接觸最多最為熟悉的部分開始比較好 , 比如:在我們日常開發中創建的類,調用的函數,在函數中定義的局部變量以及 new 出來的數據容器(Map,List,Set .....等)都需要存儲在物理內存中的某個角落 。
而我們在程序中編寫業務邏輯代碼的時候,往往需要引用這些創建出來的數據結構,并通過這些引用對相關數據結構進行業務處理 。
當程序運行起來之后就變成了進程,而這些業務數據結構的引用在進程的視角里全都都是虛擬內存地址,因為進程無論是在用戶態還是在內核態能夠看到的都是虛擬內存空間,物理內存空間被操作系統所屏蔽進程是看不到的 。
進程通過虛擬內存地址訪問這些數據結構的時候,虛擬內存地址會在內存管理子系統中被轉換成物理內存地址 , 通過物理內存地址就可以訪問到真正存儲這些數據結構的物理內存了 。隨后就可以對這塊物理內存進行各種業務操作,從而完成業務邏輯 。

  • 那么到底什么是虛擬內存地址 ?
  • Linux 內核為啥要引入虛擬內存而不直接使用物理內存 ?
  • 虛擬內存空間到底長啥樣?
  • 內核如何管理虛擬內存?
  • 什么又是物理內存地址 ?如何訪問物理內存?
本文筆者就來為大家詳細一一解答上述幾個問題,讓我們馬上開始吧~~~~
一步一圖帶你深入理解 Linux 虛擬內存管理

文章插圖
1. 到底什么是虛擬內存地址【一步一圖帶你深入理解 Linux 虛擬內存管理】首先人們提出地址這個概念的目的就是用來方便定位現實世界中某一個具體事物的真實地理位置,它是一種用于定位的概念模型 。
舉一個生活中的例子,比如大家在日常生活中給親朋好友郵寄一些本地特產時,都會填寫收件人地址以及寄件人地址 。以及在日常網上購物時,都會在相應電商 APP 中填寫自己的收獲地址 。
一步一圖帶你深入理解 Linux 虛擬內存管理

文章插圖
隨后快遞小哥就會根據我們填寫的收貨地址找到我們的真實住所,將我們網購的商品送達到我們的手里 。
收貨地址是用來定位我們在現實世界中真實住所地理位置的 , 而現實世界中我們所在的城市,街道,小區,房屋都是一磚一瓦,一草一木真實存在的 。但收貨地址這個概念模型在現實世界中并不真實存在,它只是人們提出的一個虛擬概念,通過收貨地址這個虛擬概念將它和現實世界真實存在的城市 , 小區,街道的地理位置一一映射起來,這樣我們就可以通過這個虛擬概念來找到現實世界中的具體地理位置 。
綜上所述,收貨地址是一個虛擬地址,它是人為定義的,而我們的城市,小區,街道是真實存在的,他們的地理位置就是物理地址 。
一步一圖帶你深入理解 Linux 虛擬內存管理

文章插圖
比如現在的廣東省深圳市在過去叫寶安縣 , 河北省的石家莊過去叫常山,安徽省的合肥過去叫瀘州 。不管是常山也好,石家莊也好,又或是合肥也好,瀘州也罷,這些都是人為定義的名字而已,但是地方還是那個地方,它所在的地理位置是不變的 。也就說虛擬地址可以人為的變來變去,但是物理地址永遠是不變的 。
現在讓我們把視角在切換到計算機的世界 , 在計算機的世界里內存地址用來定義數據在內存中的存儲位置的,內存地址也分為虛擬地址和物理地址 。而虛擬地址也是人為設計的一個概念 , 類比我們現實世界中的收貨地址,而物理地址則是數據在物理內存中的真實存儲位置,類比現實世界中的城市,街道,小區的真實地理位置 。

推薦閱讀