什么是MMU
MMU(Memory Management Unit)主要用來管理虛擬存儲器、物理存儲器的控制線路隔盛,同時也負責虛擬地址映射為物理地址摄狱,以及提供硬件機制的內存訪問授權而咆、多任務多進程操作系統(tǒng)。(來自百度百科烟零,對其幾個點不熟悉瘪松,因此可以只考慮加粗部分)
發(fā)展歷史
注意:學習一個知識點咸作,很重要的一步是了解其為什么而存在?它的存在是為了解決什么問題宵睦?然后记罚,在學習的過程中帶著這些問題去理解、去思考壳嚎。
在許多年以前桐智,還是使用DOS或一些古老的操作系統(tǒng)時,內存很小烟馅,同時说庭,應用程序也很小,將程序存儲在內存中基本能夠滿足需要郑趁。隨著科技的發(fā)展刊驴,圖形界面及一些其他更復雜的應用出現(xiàn),內存已經(jīng)無法存儲這些應用程序了寡润,通常的解決辦法是將程序分割成很多個覆蓋塊捆憎,覆蓋塊0最先運行,運行結束之后梭纹,就調用另一個覆蓋塊躲惰,雖然這些操作由OS來完成,但是栗柒,需要程序員對程序進行分割礁扮,這非常不高效;因此瞬沦,人們想出了一個虛擬存儲器(virtual memory)的方法太伊。虛擬存儲器的基本思想是:程序、數(shù)據(jù)逛钻、堆棧的總大小可以超過內存空間的大小僚焦,操作系統(tǒng)將當前運行的部分保存在內存中,未使用的部分保存在磁盤中曙痘。比如一個16MB的程序和一個內存只有4MB的機器芳悲,操作系統(tǒng)通過選擇可以決定哪部分4MB的程序內容保存在內存中,并在需要時边坤,在內存與磁盤中交換程序代碼名扛,這樣16MB的代碼就可以運行在4MB的機器中了。注意:這里面包含了虛擬地址和物理地址的概念
相關概念
地址范圍茧痒、虛擬地址映射成物理地址以及分頁機制
- 地址范圍: 指處理器能夠產(chǎn)生的地址集合肮韧,如一個32bit的處理器ARM9,其能產(chǎn)生的地址集合是0x0000 0000 ~ 0xffff ffff(4G),這個地址范圍也稱為虛擬地址空間弄企,其中對應的地址為虛擬地址超燃。
- 虛擬地址與物理地址: 與虛擬地址空間和虛擬地址相對應的是物理地址空間和物理地址;物理地址空間只是虛擬地址空間的一個子集拘领。如一臺內存為256MB的32bit X86主機意乓,其虛擬地址空間是0 ~ 0xffffffff(4GB),物理地址空間范圍是0 ~ 0x0fff ffff(256M)
-
分頁機制:
-
如果處理器沒有MMU约素,或者有MMU但沒有啟用届良,CPU執(zhí)行單元發(fā)出的內存地址將直接傳到芯片引腳上,被內存芯片(以下稱為物理內存业汰,以便與虛擬內存區(qū)分)接收伙窃,這稱為物理地址(Physical Address,以下簡稱PA)样漆,如下圖3-1-1所示为障;
如果處理器啟用了MMU,CPU執(zhí)行單元發(fā)出的內存地址將被MMU截獲放祟,從CPU到MMU的地址稱為虛擬地址(Virtual Address鳍怨,以下簡稱VA),而MMU將這個地址翻譯成另一個地址發(fā)到CPU芯片的外部地址引腳上跪妥,也就是將VA映射成PA鞋喇,,如下圖3-1-2眉撵。
大多數(shù)使用MMU的機器都采用分頁機制侦香。虛擬地址空間以頁為單位進行劃分,而相應的物理地址空間也被劃分纽疟,其使用的單位稱為頁幀罐韩,頁幀和頁必須保持相同,因為內存與外部存儲器之間的傳輸是以頁為單位進行傳輸?shù)?/strong>污朽。例如散吵,MMU可以通過一個映射項將VA的一頁0xb70010000xb7001fff映射到PA的一頁0x20000x2fff,如果CPU執(zhí)行單元要訪問虛擬地址0xb7001008蟆肆,則實際訪問到的物理地址是0x2008矾睦。
-
虛擬內存的哪個頁面映射到物理內存的哪個頁幀是通過頁表(Page Table)來描述的,頁表保存在物理內存中炎功,MMU會查找頁表來確定一個VA應該映射到什么PA枚冗。
功能
執(zhí)行過程
操作系統(tǒng)和MMU是這樣配合的:
操作系統(tǒng)在初始化或分配、釋放內存時會執(zhí)行一些指令在物理內存中填寫頁表蛇损,然后用指令設置MMU官紫,告訴MMU頁表在物理內存中的什么位置肛宋。
設置好之后州藕,CPU每次執(zhí)行訪問內存的指令都會自動引發(fā)MMU做查表和地址轉換操作束世,地址轉換操作由硬件自動完成,不需要用指令控制MMU去做床玻。
重要:我們在程序中使用的變量和函數(shù)都有各自的地址毁涉,在程序被編譯后,這些地址就成了指令中的地址锈死,指令中的地址就成了CPU執(zhí)行單元發(fā)出的內存地址贫堰,所以在啟用MMU的情況下, 程序中使用的地址均是虛擬內存地址待牵,都會引發(fā)MMU進行查表和地址轉換操作其屏。(注意理解這句話)
內存保護機制
處理器一般有用戶模式(User Mode)和特權模式(privileged Mode)之分。操作系統(tǒng)可以在頁表中設置每個頁表訪問權限缨该,有些頁表不可以訪問偎行,有些頁表只能在特權模式下訪問,有些頁表在用戶模式和特權模式下都可以訪問贰拿,同時蛤袒,訪問權限又分為可讀、可寫和可執(zhí)行三種膨更。這樣設定之后妙真,當CPU要訪問一個VA(Virtual Address)時,MMU會檢查CPU當前處于用戶模式還是特權模式荚守,訪問內存的目的是讀數(shù)據(jù)珍德、寫數(shù)據(jù)還是取指令執(zhí)行,如果與操作系統(tǒng)設定的權限相符矗漾,則允許訪問锈候,把VA轉換成PA,否則不允許執(zhí)行缩功,產(chǎn)生異常(Exception)晴及。
異常與中斷:異常與中斷的處理機制類似,不同的是中斷由外部設備產(chǎn)生嫡锌,而 異常由CPU內部產(chǎn)生的虑稼;中斷產(chǎn)生與CPU當前執(zhí)行的指令無關,而異常是由于當前執(zhí)行的指令出現(xiàn)問題導致的
通常操作系統(tǒng)會將虛擬地址空間劃分為用戶空間和內核空間势木。例如x86平臺的linux系統(tǒng)的虛擬地址空間范圍是0x0000 0000 ~ 0xffff ffff蛛倦,前3G的空間為用戶空間,后1G的空間為內核空間啦桌。用戶程序加載到用戶空間溯壶,內核程序加載到內核空間及皂,用戶程序不能訪問內核中的數(shù)據(jù),也不能跳轉到內核空間執(zhí)行且改。這樣可以保護內核验烧,如果一個進程訪問了非法地址,頂多就是這個進程崩潰又跛,而不會影響到內核和系統(tǒng)的穩(wěn)定性碍拆。在系統(tǒng)發(fā)生中斷或異常時,不僅會跳轉到中斷或異常服務函數(shù)中執(zhí)行慨蓝,而且還會從用戶模式切換到特權模式感混,從中斷或異常服務程序跳轉到內核代碼中執(zhí)行。總結一下:在正常情況下處理器在用戶模式執(zhí)行用戶程序礼烈,在中斷或異常情況下處理器切換到特權模式執(zhí)行內核程序弧满,處理完中斷或異常之后再返回用戶模式繼續(xù)執(zhí)行用戶程序。
段錯誤我們已經(jīng)遇到過很多次了此熬,它是這樣產(chǎn)生的:
- 用戶程序要訪問的一個VA庭呜,經(jīng)MMU檢查無權訪問。
- MMU產(chǎn)生一個異常摹迷,CPU從用戶模式切換到特權模式疟赊,跳轉到內核代碼中執(zhí)行異常服務程序。
- 內核把這個異常解釋為段錯誤峡碉,把引發(fā)異常的進程終止掉近哟。
S3C2440/S3C2410 中的MMU
S3C2440/S3C2410 MMU概述
S3C2440的MMU使用頁表來實現(xiàn)虛擬地址到物理地址的轉換;頁表存儲在內存中鲫寄,頁表中的每一行對應于虛擬存儲空間的一個頁吉执,該行包含了該虛擬內存頁對應的物理內存頁的地址、該頁的方位權限和該頁的緩沖特性等地来。這里頁表中的每一行稱為一個地址變換條目(entry)也稱為“描述符”戳玫。描述符有:段描述符、大頁描述符未斑、小頁描述符咕宿、極小頁描述符——他們保存段、大頁蜡秽、小頁或極小頁的起始物理地址府阀;粗頁表描述符、細頁表描述符——它們保存二級頁表的物理地址芽突。
頁表的存儲:頁表存放在內存中试浙,系統(tǒng)通常有一個寄存器來保存頁表的基地址。在ARM中系統(tǒng)控制協(xié)處理器CP15的寄存器C2用來保存頁表的基地址寞蚌。
TLB:因為從虛擬地址到物理地址的變換過程是通過查詢頁表完成的田巴,而頁表又存儲在內存中钠糊,如果每次程序執(zhí)行時去讀取內存中的數(shù)據(jù)獲取物理地址,代價很大壹哺。而程序在執(zhí)行過程中可能只對頁表中的少數(shù)幾個單元進行訪問抄伍,根據(jù)這一特點,采用一個容量更卸孵铩(通常為8~16個字)逝慧、訪問速度和CPU中通用寄存器相當?shù)拇鎯ζ骷泶娣女斍霸L問需要的地址變換條目。這個小容量的頁表稱為TLB(Translation Lookaside buffer)啄糙。
S3C2440/S3C2410中的頁表
在S32440/S3C2410中最多會使用兩級頁表:以段(Section 1MB)的方式進行轉換時只用到一級頁表,以頁(Page)的方式進行轉換時用到二級頁表云稚。CPU訪問內存的過程:
a . 當CPU需要訪問內存時隧饼,先在TLB中查詢需要的地址變換條目。如果該條目不存在静陈,CPU從位于內存中的頁表中查詢燕雁,并把相應的結果添加到TLB中。這樣鲸拥,當CPU下一次又需要該地址變換條目時拐格,可以從TLB中直接得到,從而使地址變換的速度大大加快刑赶。
b. 當內存中的頁表內容改變捏浊,或者通過修改系統(tǒng)控制協(xié)處理器CP15的寄存器C2使用新的頁表時,TLB中的內容需要全部清除撞叨。系統(tǒng)控制協(xié)處理器CP15的寄存器C8用來控制清除TLB內容的相關操作金踪。
c. MMU可以將某些地址變換條目鎖定在TLB中,從而使得獲取該地址變換條目的速度保持很快牵敷。在CP15中的C10用于控制TLB內容的鎖定胡岔。
d. MMU 可以將整個存儲空間分為最多16個域,每個域對應一定的內存區(qū)域枷餐,該區(qū)域具有相同的訪問控制屬性靶瘸。MMU中寄存器C3用于控制與域相關的屬性的配置。
e. 當存儲訪問失效時毛肋,MMU提供了相應的機制用于處理這種情況怨咪。在MMU中寄存器C5和寄存器C6用于支持這些機制。
禁止/使能MMU時應注意的問題(重要)
應注意如下幾點:
- 在使能MMU之前村生,要在內存中建立頁表惊暴,同時,CP15中的各相關寄存器必須完成初始化趁桃。
- 如果使用的不是平板存儲模式(物理地址和虛擬地址相等)辽话,在禁止/使能MMU時肄鸽,虛擬地址和物理地址的對應關系會發(fā)生改變,這時應該清除cache中的當前地址變換條目油啤。
S3C2440/S3C2410中的MMU地址變換
ARM CPU上的地址轉換過程涉及3個概念:虛擬地址(VA)典徘、變換后的虛擬地址(MVA, modified virtrual address)、物理地址(PA)益咬。
沒啟動MMU時逮诲,CPU核、cache幽告、MMU梅鹦、外設等所有部件使用的都是物理地址。
啟動MMU后冗锁,CPU核對外發(fā)出虛擬地址VA齐唆;VA被轉換為MVA供cache、MMU使用冻河,在這里MVA被轉換為PA箍邮,最后使用PA讀寫實際設備。
ARM支持的存儲塊大小有以下幾種:
- 段(section):是大小為1M的存儲塊叨叙。
- 大頁(Large Pages):是大小為64KB的存儲塊锭弊。
- 小頁(Small Pages):是大小為4KB的存儲塊。
- 極小頁(Tiny Pages):是大小為1KB的存儲塊擂错。
通過配置訪問控制機制味滞,還可以將大頁分成大小為16KB的子頁;將小頁分成大小為1KB的子頁马昙;極小頁不能再細分桃犬,只能以1KB大小的整頁為單位。
MMU中的域
MMU中的域指的是一些段行楞、大頁或者小頁的集合攒暇。ARM支持最多16個域,每個域的訪問控制特性由CP15中的寄存器C3中的兩位來控制子房,CP15中的寄存器C3的格式如下所示:
其中每兩位控制一個域的訪問控制特性形用,其編碼及對應的含義如下所示: