1, 介紹
前面的文章《一文搞懂Cortex-A77(ARMv8架構(gòu))工作原理》,《一文搞懂cpu cache工作原理》介紹CPU、cache的組成與工作原理,這篇文章將介紹CPU與cache之間的MMU的組成與工作原理。通過本文可以了解CPU訪問的虛擬地址是怎么轉(zhuǎn)換成物理地址,然后通過物理地址在cache、主存或者EMMC中獲取相應(yīng)的數(shù)據(jù)。
早期的內(nèi)存是比較小的,一般是幾十k,不過相應(yīng)的程序也是比較小的,這時程序可以直接加載到內(nèi)存中運行。后來為了支持多個程序的并行,內(nèi)存中出現(xiàn)了固定分區(qū),在編譯階段將不同程序,劃分在不同的內(nèi)存區(qū)域上。這種方式存在不少問題:一是內(nèi)存分區(qū)大小與程序大小要匹配,二是地址空間無法動態(tài)的增長。于是內(nèi)存動態(tài)分區(qū)思想便誕生了,內(nèi)存上線劃出一塊區(qū)域給操作系統(tǒng),然后剩余的內(nèi)存空間給用戶進程使用,這樣用戶程序所使用的內(nèi)存空間,跟隨程序大小及數(shù)目進行變動。
不論是靜態(tài)分析,還是動態(tài)分區(qū),都存在一些問題:進程地址空間安全問題、內(nèi)存使用效率低。為了能夠讓多程序安全、高效地并行運行,物理內(nèi)存中需要存放多個程序的代碼及數(shù)據(jù),這時虛擬內(nèi)存便誕生了。不得不說虛擬內(nèi)存是一個偉大的發(fā)明,一方面它讓每個程序認為自己是獨自、連續(xù)的使用內(nèi)存,另一方面,每個程序之間的內(nèi)存形成了安全隔離,避免程序破壞彼此的內(nèi)存。
后來隨著軟件的快速發(fā)展,一個程序的大小變得很大,這時物理內(nèi)存大小跟不上程序大小增加的速度。這樣便不能將整個程序加載到物理內(nèi)存中,一是物理內(nèi)存沒有這么大,二是如果將整個程序加載到內(nèi)存,為了多程序并行,就需要將大量的數(shù)據(jù)及代碼換入、換出,這導(dǎo)致程序運行效率低下。
虛擬內(nèi)存并沒解決高效使用內(nèi)存的問題,好在程序運行遵循時間、空間局部性原理,進而出現(xiàn)了分頁機制。分頁機制從根本上解決了高效使用物理內(nèi)存的問題。每次只需要將幾頁的代碼、數(shù)據(jù)從磁盤中加載到內(nèi)存,程序就能正常運行。當(dāng)程序運行的過程中,需要新的代碼、數(shù)據(jù)會產(chǎn)生缺頁異常,這些代碼、數(shù)據(jù)就會從磁盤加載到內(nèi)存,然后程序從異?;謴?fù)正常運行。
對于支持虛擬內(nèi)存,分頁機制的系統(tǒng),處理器直接尋址虛擬地址,這個地址不會直接發(fā)給內(nèi)存控制器,而是先發(fā)給內(nèi)存管理單元(Memory Manager Unit,MMU)。MMU就是負責(zé)將虛擬地址轉(zhuǎn)換和翻譯成物理地址的一個硬件模塊,其實MMU所做的事,完全可以通過CPU來實現(xiàn)。為啥還要一個MMU硬件模塊呢?就是為了提升虛擬地址到物理地址轉(zhuǎn)換的速度,減少轉(zhuǎn)換所消耗的時間。
MMU包含兩個模塊TLB(Translation Lookaside Buffer)和TWU(Table Walk Unit)。TLB是一個高速緩存,用于緩存頁表轉(zhuǎn)換的結(jié)果,從而縮短頁表查詢的時間。TWU是一個頁表遍歷模塊,頁表是由操作系統(tǒng)維護在物理內(nèi)存中,但是頁表的遍歷查詢是由TWU完成的,這樣減少對CPU資源的消耗。
虛擬內(nèi)存及分頁機制的出現(xiàn),解決了進程地址空間安全性的問題和內(nèi)存使用效率低的問題,但是也引入了系統(tǒng)性能變差的問題。本來CPU可以直接通過訪存執(zhí)行程序,但是現(xiàn)在引入了虛擬地址到物理地址的轉(zhuǎn)換。MMU硬件模塊的出現(xiàn),就是為了解決這個性能問題。因此,幾G運行內(nèi)存的電腦,可以并行運行幾十G的多程序,讓你在聽歌的同時,能夠并行處理編輯文檔,下載電影,收發(fā)郵件等。
2, 框架
2.1 內(nèi)存管理體系結(jié)構(gòu)
在SMP(Symmetric Multi Process,對稱多處理器)系統(tǒng)中,每個處理器內(nèi)置了MMU模塊,MMU模塊包含了TLB和TWU兩個子模塊。TLB是一個高速緩存,用于緩存虛擬地址到物理地址的轉(zhuǎn)換結(jié)果。頁表的查詢過程是由TWU硬件自動完成的,但是頁表的維護是需要操作系統(tǒng)實現(xiàn)的,頁表存放在主存中。
頁表的查詢是一個耗時的過程,理想情況下,TLB命中,可以從中直接得到虛擬地址對應(yīng)的物理地址。當(dāng)TLB未命中的時候,MMU才會通過TWU查詢頁表,從而翻譯虛擬地址得到物理地址。得到物理地址后,首先要查詢該物理地址的內(nèi)容是否存在于cache中,若cache命中,則直接取出物理地址對應(yīng)的內(nèi)容返回給處理器。
若cache沒有命中,會進一步訪問主存獲取相應(yīng)的內(nèi)容,然后回寫到cache,并返回給處理器。如果沒能在頁表中查詢到虛擬地址對應(yīng)的物理地址,則會觸發(fā)一個與MMU相關(guān)的缺頁異常,在異常處理的過程中,會將EMMC中相關(guān)的數(shù)據(jù)加載到主存,然后建立相應(yīng)的頁表,然后將物理地址對應(yīng)的內(nèi)容返回給cache及處理器。
2.2 MMU相關(guān)的基本概念
(1)虛擬地址相關(guān)基本概念
虛擬內(nèi)存(Virtual Memory,VM):為每個進程提供了一致的、連續(xù)的、私有的內(nèi)存空間,簡化了內(nèi)存管理。將主存看成是一個存儲在磁盤上的地址空間的高速緩存,當(dāng)運行多個進程或者一個進程需要更多的空間時,主存顯然是不夠用的,這時需要更大、更便宜的磁盤保存一部分數(shù)據(jù)。
虛擬地址空間(Virtual Address Space,VAS):每個進程獨有。
虛擬頁(Virtual Page,VP):把虛擬內(nèi)存按照頁表大小進行劃分。
虛擬地址(Virtual Address,VA):處理器看到的地址。
虛擬頁號(Virtual Page Number,VPN):用于定位頁表的PTE。
(2)物理地址相關(guān)的基本概念
物理內(nèi)存(Physical Memory,PM):主存上能夠使用的物理空間。
物理頁(Physical Page):把物理內(nèi)存按照頁表的大小進行劃分。
物理地址(Physical Address,PA):物理內(nèi)存劃分很多塊,通過物理內(nèi)存進行定位。
物理頁號(Physical Page Number,PPN):定位物理內(nèi)存中塊的位置。
(3)頁表相關(guān)的基本概念
頁表(Page Tabel):虛擬地址與物理地址映射表的集合。
頁表條目(Page Table Entry,PTE):虛擬地址與獨立地址具體對應(yīng)的記錄。
頁全局目錄(Page Global Directory,PGD):多級頁表中的最高一級。
頁上級目錄(Page Upper Directory,PUD):多級頁表中的次高一級。
頁中間目錄(Page Middle Directory,PMD):多級頁表中的一級。
2.3 頁命中、缺頁
(1)頁命中
a) 處理器要對虛擬地址VA進行訪問。 b) MMU的TLB沒有命中,通過TWU遍歷主存頁表中的PTE地址。 c) 主存向MMU返回PTE。 d) MMU通過PTE映射物理地址,并把它傳給高速緩存或主存。 e) 高速緩存或主存返回物理地址對應(yīng)的數(shù)據(jù)給處理器。
(2)缺頁
a) 處理器要對虛擬地址VA進行訪問。 b) MMU的TLB沒有命中,通過TWU遍歷主存頁表中的PTE地址。 c) 主存向MMU返回PTE。 d) PTE中有效位是0,MMU觸發(fā)一次異常,CPU相應(yīng)缺頁異常,運行相應(yīng)的處理程序。 e) 缺頁異常處理程序選出物理內(nèi)存中的犧牲頁,若這個頁面已經(jīng)被修改,將其換出到EMMC。 f) 缺頁異常處理程序從EMMC中加載新的頁面,并更新內(nèi)存中頁表的PTE。 g) 缺頁異常處理程序返回到原來的進程,再次執(zhí)行導(dǎo)致缺頁的指令。CPU將引起缺頁異常的虛擬地址重新發(fā)給MMU。由于虛擬頁面現(xiàn)在緩存在主從中,主存會將所請求的地址對應(yīng)的內(nèi)容返回給cache和處理器。
2.4 多級頁表映射過程
物理頁面大小一級地址總線寬度不同,頁表的級數(shù)也不同。以AArch64運行狀態(tài),4KB大小物理頁面,48位地址寬度為例,頁表映射的查詢過程如圖:
對于多任務(wù)操作系統(tǒng),每個用戶進程都擁有獨立的進程地址空間,也有相應(yīng)的頁表負責(zé)虛擬地址到物理地址之間的轉(zhuǎn)換。MMU查詢的過程中,用戶進程的一級頁表的基址存放在TTBR0。操作系統(tǒng)的內(nèi)核空間公用一塊地址空間,MMU查詢的過程中,內(nèi)核空間的一級頁表基址存放在TTBR1。
當(dāng)TLB未命中時,處理器查詢頁表的過程如下:
處理器根據(jù)虛擬地址第63位,來選擇使用TTBR0或者TTBR1。當(dāng)VA[63]為0時,選擇TTBR0,TTBR中存放著L0頁表的基址。
處理器以VA[47:39]作為L0的索引,在L0頁表中查找頁表項,L0頁表有512個頁表項。
L0頁表的頁表項中存放著L1頁表的物理基址。處理器以VA[38:30]作為L1索引,在L1頁表中找到相應(yīng)的頁表項,L1頁表中有512個頁表項。
L1頁表的頁表項中存放著L2頁表的物理基址。處理器以VA[29:21]作為L2索引,在L2頁表中找到相應(yīng)的頁表項,L2頁表中有512個頁表項。
L2頁表的頁表項中存放著L3頁表的物理基址。處理器以VA[20:12]作為L1索引,在L3頁表中找到相應(yīng)的頁表項,L3頁表中有512個頁表項。
L3頁表的頁表項里,存放著4KB頁面的物理基址,然后加上VA[11:0],這樣就構(gòu)成了物理地址,至此處理器完成了一次虛擬地址到物理地址的查詢與翻譯的工作。
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
18927瀏覽量
227252 -
ARM
+關(guān)注
關(guān)注
134文章
8967瀏覽量
365059 -
SMP
+關(guān)注
關(guān)注
0文章
70瀏覽量
19557 -
TLB電路
+關(guān)注
關(guān)注
0文章
9瀏覽量
5245 -
MMU
+關(guān)注
關(guān)注
0文章
91瀏覽量
18169
原文標題:一文搞懂MMU工作原理
文章出處:【微信號:IC大家談,微信公眾號:IC大家談】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論