以下內(nèi)容摘自《步步驚芯——軟核處理器內(nèi)部設(shè)計(jì)分析》一書(shū)的第10章 MMU剖析 MMU 的作用及工作過(guò)程MMU ( Memory Management Unit )是內(nèi)存管理單元的簡(jiǎn)稱,,讀者朋友在學(xué)習(xí)嵌入式的時(shí)候應(yīng)該聽(tīng)說(shuō)過(guò) μCLinux ,這是適合沒(méi)有 MMU 的微控制器使用的嵌入式 Linux 操作系統(tǒng),,比如 ARM7 ,。由于沒(méi)有 MMU ,所以在 μCLinux 上實(shí)現(xiàn)多任務(wù)功能是一個(gè)非常棘手的問(wèn)題,。從而引出了本節(jié)的關(guān)注點(diǎn): MMU 的作用是什么,?簡(jiǎn)單地說(shuō), MMU 的作用有兩點(diǎn):地址翻譯,、內(nèi)存保護(hù),。 1 、地址翻譯 在處理器上一般會(huì)運(yùn)行一個(gè)操作系統(tǒng),,如 Linux ,,用戶編寫的源程序需要經(jīng)過(guò)編譯、鏈接得到可執(zhí)行文件,,然后被操作系統(tǒng)加載執(zhí)行,。編譯、鏈接的過(guò)程在第 2 章實(shí)驗(yàn)環(huán)境搭建中有過(guò)描述,,在鏈接的時(shí)候需要指定一個(gè)鏈接描述腳本,,鏈接描述腳本有很多作用,其中一項(xiàng)是控制可執(zhí)行文件中 Section 和符號(hào)的內(nèi)存布局,,也就是控制可執(zhí)行程序在內(nèi)存中是如何放置的,,操作系統(tǒng)會(huì)按照可執(zhí)行文件的要求將其加載到內(nèi)存對(duì)應(yīng)地址并執(zhí)行。假如用戶 A 編寫了程序 ProgramA ,,并且 ProgramA 占用的內(nèi)存空間是 0x100-0x200 ,,用戶 B 編寫了程序 ProgramB ,并且 ProgramB 要求的內(nèi)存空間也是 0x100-0x200 ,,這是完全有可能的,,因?yàn)榻o操作系統(tǒng)提供程序的用戶很多,不可能限定每個(gè)用戶使用不同部分的內(nèi)存,。這樣當(dāng) ProgramA 被加載執(zhí)行時(shí),, ProgramB 就不能被加載執(zhí)行,一旦 ProgramB 也被加載了就會(huì)破壞 ProgramA 的執(zhí)行,,因?yàn)楹笳邥?huì)覆蓋 ProgramA 占用的內(nèi)存,。為了解決這個(gè)問(wèn)題,將操作系統(tǒng)和處理器都做了修改,,添加了 MMU ,,在其中進(jìn)行地址翻譯,程序加載入內(nèi)存的時(shí)候?yàn)槠浣⒌刂贩g表,,處理器執(zhí)行不同程序的時(shí)候使用不同的地址翻譯表,,如圖 10.1 所示,。
ProgramA 被加載到地址 0x500-0x600 處, ProgramB 被加載到地址 0x700-0x800 處,,同時(shí)建立了各自的地址翻譯表,,當(dāng)處理器要執(zhí)行 ProgramB 時(shí),會(huì)使用 ProgramB 對(duì)應(yīng)的地址翻譯表,,比如讀取 ProgramB 地址 0x100 處的指令,,那么經(jīng)過(guò)地址翻譯表可知 0x100 對(duì)應(yīng)實(shí)際內(nèi)存的 0x700 處,所以實(shí)際讀取的就是 0x700 處的指令,。同樣的,,當(dāng)處理器要執(zhí)行 ProgramA 時(shí),,會(huì)使用 ProgramA 對(duì)應(yīng)的地址翻譯表,,這樣就避免了之前提到的內(nèi)存沖突問(wèn)題,有了 MMU 的支持,,操作系統(tǒng)就可以輕松實(shí)現(xiàn)多任務(wù)了,。 圖 10.1 中 CPU 給出的地址稱之為虛擬地址( OR1200 中稱之為有效地址 EA ),經(jīng)過(guò) MMU 翻譯后的地址稱之為物理地址,。 MMU 的地址翻譯功能還可以為用戶提供比實(shí)際大得多的內(nèi)存空間,。用戶在編寫程序的時(shí)候并不知道運(yùn)行該程序的計(jì)算機(jī)內(nèi)存大小,如果在鏈接的時(shí)候指定程序被加載到地址 Addr 處,,而運(yùn)行該程序的計(jì)算機(jī)內(nèi)存小于 Addr ,,那么程序就無(wú)法執(zhí)行,有了 MMU 后,,程序員就不用關(guān)心實(shí)際內(nèi)存大小,,可以認(rèn)為內(nèi)存大小就是“ 2^ 指令地址寬度”。 MMU 會(huì)將超過(guò)實(shí)際內(nèi)存的虛擬地址翻譯為物理地址進(jìn)行訪問(wèn),。 地址翻譯表存儲(chǔ)在內(nèi)存中,,如果采用圖 10.1 中的方式:地址翻譯表的表項(xiàng)是一個(gè)虛擬地址對(duì)應(yīng)一個(gè)物理地址,那么會(huì)占用太多的內(nèi)存空間,,為此,,需要修改翻譯方式,常用的有三種:頁(yè)式,、段式,、段頁(yè)式,這也是三種不同的內(nèi)存管理方式,。 頁(yè)式內(nèi)存管理將虛擬內(nèi)存,、物理內(nèi)存空間劃分為大小固定的塊,每一塊稱之為一頁(yè),,以頁(yè)為單位來(lái)分配,、管理,、保護(hù)內(nèi)存。此時(shí) MMU 中的地址翻譯表稱為頁(yè)表( Page Table ),,每個(gè)任務(wù)或進(jìn)程對(duì)應(yīng)一個(gè)頁(yè)表,,頁(yè)表由若干個(gè)頁(yè)表項(xiàng)( PTE : Page Table Entry )組成,每個(gè)頁(yè)表項(xiàng)對(duì)應(yīng)一個(gè)虛頁(yè),,內(nèi)含有關(guān)地址翻譯的信息和一些控制信息,。在頁(yè)式內(nèi)存管理方式中地址由頁(yè)號(hào)和頁(yè)內(nèi)位移兩部分組成,其地址翻譯方式如圖 10.2 所示,。
使用虛擬地址中的虛頁(yè)號(hào)查詢頁(yè)表得到對(duì)應(yīng)的物理頁(yè)號(hào),,然后與虛擬地址中的頁(yè)內(nèi)位移組成物理地址。比如:頁(yè)大小是 256 字節(jié),,虛擬地址是 0x104 ,,可知對(duì)應(yīng)的虛頁(yè)號(hào)是 0x1 ,頁(yè)內(nèi)位移是 0x4 ,,假如通過(guò)頁(yè)表翻譯得到的對(duì)應(yīng)物理頁(yè)號(hào)是 0x7 ,,那么 0x104 對(duì)應(yīng)的物理地址就是 0x704 。使用頁(yè)表方式進(jìn)行地址翻譯可以有效減少地址翻譯表占用的內(nèi)存空間,,還是以圖 10.1 為例,,頁(yè)大小是 256 字節(jié),此時(shí)每個(gè)程序?qū)?yīng)的頁(yè)表就只有兩項(xiàng),,如圖 10.3 所示,。
段式內(nèi)存管理將虛擬內(nèi)存、物理內(nèi)存空間劃分為段進(jìn)行管理,,段的大小取決于程序的邏輯結(jié)構(gòu),,可長(zhǎng)可短,一般將一個(gè)具有共同屬性的程序代碼和數(shù)據(jù)定義在一個(gè)段中,。每個(gè)任務(wù)和進(jìn)程對(duì)應(yīng)一個(gè)段表( Segment Table ),,段表由若干個(gè)段表項(xiàng)( STE : Segment Table Entry )組成,內(nèi)含地址映像信息(段基址和段長(zhǎng)度)等內(nèi)容,。在段式虛擬存儲(chǔ)器中,,地址分為段號(hào)、段內(nèi)位移兩部分,,使用段表進(jìn)行地址翻譯的過(guò)程與使用頁(yè)表進(jìn)行地址翻譯的過(guò)程是相似的,。 段頁(yè)式內(nèi)存管理是在內(nèi)存分段的基礎(chǔ)上再分頁(yè),即每段分成若干個(gè)固定大小的頁(yè),。每個(gè)任務(wù)或進(jìn)程對(duì)應(yīng)有一個(gè)段表,,每段對(duì)應(yīng)有自己的頁(yè)表。在訪問(wèn)存儲(chǔ)器時(shí),由 CPU 經(jīng)頁(yè)表對(duì)段內(nèi)存儲(chǔ)單元進(jìn)行尋址,。 OR1200 處理器中的 MMU 使用頁(yè)表進(jìn)行地址翻譯,,所以本章對(duì)段式、段頁(yè)式不做過(guò)多著墨,,同時(shí),,下文介紹內(nèi)存保護(hù)、 TLB 時(shí)都默認(rèn)是頁(yè)式內(nèi)存管理,。 2 ,、內(nèi)存保護(hù) MMU 除了具有地址翻譯的功能外,還提供了內(nèi)存保護(hù)功能,。采用頁(yè)式內(nèi)存管理時(shí)可以提供頁(yè)粒度級(jí)別的保護(hù),,允許對(duì)單一內(nèi)存頁(yè)設(shè)置某一類用戶的讀、寫,、執(zhí)行權(quán)限,,比如:一個(gè)頁(yè)中存儲(chǔ)代碼,并且該代碼不允許在用戶模式下執(zhí)行,,那么可以設(shè)置該頁(yè)的保護(hù)屬性,,這樣當(dāng)處理器在用戶模式下要求執(zhí)行該頁(yè)的代碼時(shí),, MMU 會(huì)檢測(cè)到并觸發(fā)異常,,從而實(shí)現(xiàn)對(duì)代碼的保護(hù)。下文在分析 OR1200 處理器中 MMU 模塊時(shí)會(huì)具體介紹內(nèi)存保護(hù)的實(shí)現(xiàn)機(jī)制,。 |
|