MMU的重要性不言而喻,支撐操作系統(tǒng)之上的各種復(fù)雜應(yīng)用。但在正式講MMU之前,我們先說(shuō)說(shuō)MMU的發(fā)展史,因?yàn)锳RMv8-A的MMU相當(dāng)復(fù)雜,直接切入正題,會(huì)顯得比較枯燥。廢話不多說(shuō),咱們馬上開(kāi)始:
一、前言:
早期計(jì)算機(jī)是沒(méi)有MMU的概念的,也沒(méi)有對(duì)存儲(chǔ)器的抽象,直接將物理內(nèi)存暴露給程序用。那個(gè)時(shí)候硬件資源有限,大家都勒緊褲腰帶寫(xiě)程序,不敢多浪費(fèi)一個(gè)字節(jié)。我曾經(jīng)規(guī)劃過(guò)一個(gè)游戲掌機(jī)的開(kāi)源項(xiàng)目,將早期的街機(jī)游戲移植到現(xiàn)代硬件上。
在調(diào)研階段我就發(fā)現(xiàn),這些程序都很小,只有十幾KB,但無(wú)一例外,都是對(duì)內(nèi)存進(jìn)行直接操作(有點(diǎn)類(lèi)似單片機(jī)/微控制器編程)。
但在那個(gè)年代,硬件的迭代速度不如軟件快,而彼時(shí)的代碼業(yè)務(wù)邏輯已經(jīng)相當(dāng)復(fù)雜,程序的體積呈指數(shù)級(jí)增長(zhǎng)。
所以早期開(kāi)發(fā)人員,為了使得越來(lái)越龐大的程序,能夠在資源有限的硬件上運(yùn)行,發(fā)明了ovelay-覆蓋塊技術(shù),對(duì)程序進(jìn)行分割、分段運(yùn)行。
但這招治標(biāo)不治本,并不能保證程序運(yùn)行的足夠順暢,反而要為程序分段,增加的額外的工作量,這是一件相當(dāng)痛苦的事情。所以開(kāi)發(fā)人員把目光看向了硬件,決定從軟硬兩個(gè)方向下手。
說(shuō)到這里,就不得不提一下早期的虛擬化技術(shù)。該技術(shù)的硬件虛擬化方向,為以后MMU的發(fā)展奠定了基礎(chǔ)。
“硬件虛擬化”在狹義上是對(duì)內(nèi)存、硬盤(pán)等硬件做虛擬化處理(軟件為主),配合操作系統(tǒng)以達(dá)到分時(shí)復(fù)用的效果。1964 年,IBM 推出了大名鼎鼎的 System/360。它不僅提供了新型的操作系統(tǒng),還實(shí)現(xiàn)了基于全硬件虛擬化(Full Hardware Virtualization)的虛擬機(jī)解決方案。
這其中就包括頁(yè)式虛擬內(nèi)存(4k 分頁(yè)虛擬存儲(chǔ)系統(tǒng))、虛擬磁盤(pán)以及 TSS 分時(shí)系統(tǒng)。System/360 最多可提供14個(gè)虛擬機(jī),每個(gè)虛擬機(jī)具有 256k 固定虛擬內(nèi)存。有意思的是,System/360 的開(kāi)發(fā)過(guò)程被視為了計(jì)算機(jī)發(fā)展史上最大的一次豪賭,為了研發(fā) System/360,IBM 決定征召六萬(wàn)多名新員工,創(chuàng)建了五座新工廠。即便如此,當(dāng)時(shí)的出貨時(shí)間仍被不斷順延。
在后續(xù)的計(jì)算機(jī)發(fā)展中,內(nèi)存被操作系統(tǒng)抽象出來(lái),作為地址空間進(jìn)行統(tǒng)一管理,按需分配給應(yīng)用程序使用。這樣作為內(nèi)存的硬件細(xì)節(jié)(容量/類(lèi)型/廠商/...)被操作系統(tǒng)隱藏了,程序只需要關(guān)心地址空間就可以。
同時(shí)操作系統(tǒng)引入了虛擬化技術(shù),可以對(duì)內(nèi)存進(jìn)行"擴(kuò)容",本質(zhì)是對(duì)內(nèi)存的分時(shí)復(fù)用,讓每個(gè)程序認(rèn)為自己獨(dú)占了整個(gè)地址空間。但是這樣做效率并不高,因?yàn)椴僮飨到y(tǒng)需要不斷地做內(nèi)存搬運(yùn)。并且操作系統(tǒng)還要為內(nèi)存的管理算法,付出許多額外的計(jì)算(比如地址翻譯),非常浪費(fèi)性能。
所以我們就需要設(shè)計(jì)硬件,來(lái)代替一些比較繁瑣復(fù)雜的流程。最好能形成標(biāo)準(zhǔn)流程化操作,這樣做成的硬件,可以持續(xù)優(yōu)化(GPU也是這么出現(xiàn)的)。
因此,MMU誕生了,它接替了操作系統(tǒng)內(nèi)存管理的比較復(fù)雜的部分,比如地址翻譯;內(nèi)存訪問(wèn)效率,則交給了 cache(高速緩存)去做,或者提高內(nèi)存總線的帶寬。
在現(xiàn)代操作系統(tǒng)中,衍生了一種更先進(jìn)的內(nèi)存管理技術(shù),叫做虛擬內(nèi)存系統(tǒng),這是對(duì)主存的一種抽象概念。它由硬件異常、物理地址翻譯、主存、磁盤(pán)文件和內(nèi)核軟件相互配合,共同組成。
虛擬內(nèi)存系統(tǒng)主要提供了三種能力:一、提供主存的高速緩存,加快內(nèi)存訪問(wèn)速度(高速緩存);二、為每個(gè)進(jìn)程提供一致的地址空間,從而簡(jiǎn)化內(nèi)存管理;三、防止每個(gè)進(jìn)程的地址空間被其他進(jìn)程所破壞(內(nèi)存保護(hù))。
MMU的作用,就是將虛擬地址翻譯成物理地址。簡(jiǎn)單來(lái)說(shuō),CPU會(huì)生成一個(gè)虛擬地址(Virtual Address)來(lái)訪問(wèn)主存(這個(gè)地址實(shí)際上是操作系統(tǒng)來(lái)產(chǎn)生的,最后交給CPU執(zhí)行)。訪問(wèn)之前,需要先將虛擬地址轉(zhuǎn)換為物理地址,這個(gè)過(guò)程稱(chēng)作為地址轉(zhuǎn)換(地址映射/地址翻譯)。
為進(jìn)行此操作,需要CPU硬件和操作系統(tǒng)合作,通過(guò)內(nèi)存管理單元(Memory Management Unit)上的硬件翻譯地址,來(lái)完成虛擬地址到物理地址的轉(zhuǎn)換。MMU利用存儲(chǔ)在主存上的查詢表(translation table)來(lái)翻譯虛擬地址,該表的內(nèi)容由操作系統(tǒng)維護(hù)和管理。
圖 1.4 MMU地址翻譯/轉(zhuǎn)換簡(jiǎn)化流程
說(shuō)到這里,你可能對(duì)MMU的描述感到云里霧里,但不要緊,接下來(lái)我們會(huì)對(duì)它抽絲剝繭,一點(diǎn)點(diǎn)講清楚。不過(guò)我們還需要對(duì)操作系統(tǒng)的虛擬內(nèi)存系統(tǒng),做一些更詳細(xì)的講解,這樣再看MMU,就會(huì)非常輕松了。記住,這個(gè)先后順序非常重要。
二、虛擬內(nèi)存系統(tǒng)的原理:
這里我們只探討虛擬內(nèi)存系統(tǒng)如何管理虛擬內(nèi)存的,關(guān)于cache部分,我們另說(shuō)。
一般虛擬內(nèi)存系統(tǒng)會(huì)將虛擬內(nèi)存,劃分為固定大小的塊(又叫做最小粒度,一般有4KB、16KB、64KB等大小,其中4KB最流行),這個(gè)塊我們稱(chēng)作為虛擬頁(yè)(Virtual Page簡(jiǎn)稱(chēng)VP),同理將物理內(nèi)存劃分為物理頁(yè)(Physical Page簡(jiǎn)稱(chēng)PP),也叫頁(yè)幀(Page Frame)。
每個(gè)虛擬頁(yè)的首地址,會(huì)被維護(hù)在一個(gè)表內(nèi),這個(gè)表叫做查詢表或頁(yè)表(Page Table,簡(jiǎn)稱(chēng)PT),頁(yè)表內(nèi)的每一個(gè)條目,被稱(chēng)為頁(yè)表項(xiàng)(Page Table Entry,簡(jiǎn)稱(chēng)PTE)。
這個(gè)頁(yè)表可能有多級(jí),一般來(lái)說(shuō),級(jí)數(shù)越多,能覆蓋的虛擬地址范圍就越大。在多級(jí)頁(yè)表當(dāng)中,除最后一級(jí)頁(yè)表之外的所有頁(yè)表,它的頁(yè)表項(xiàng)存放的不一定是物理頁(yè),也可能是下一級(jí)頁(yè)表的地址。
圖 2.1 虛擬內(nèi)存系統(tǒng)的地址翻譯/轉(zhuǎn)換流程
在這個(gè)基礎(chǔ)上,虛擬系統(tǒng)會(huì)產(chǎn)生一個(gè)虛擬地址,由虛頁(yè)號(hào)+頁(yè)偏移組成。虛頁(yè)號(hào)存放的一般是頁(yè)表項(xiàng)的偏移地址(也可能是多級(jí)頁(yè)表的組合),通過(guò)對(duì)頁(yè)表的不斷查詢,最后找到對(duì)應(yīng)的物理頁(yè)(的首地址),然后加上虛擬地址的頁(yè)偏移,就能順利計(jì)算出真實(shí)的物理地址。如圖2.2所示:
圖 2.2 虛擬內(nèi)存系統(tǒng)的地址翻譯/轉(zhuǎn)換詳細(xì)流程
這個(gè)流程,可以用一個(gè)很恰當(dāng)?shù)睦尤ッ枋觯褪窃诘貓D軟件上找一個(gè)地方兒。
以我在地圖上找酒店入住為例,目的地在“四川省-成都市-青羊工業(yè)區(qū)-成飛路-5號(hào)”。于是,我通過(guò)手機(jī)軟件,找到一家到酒店,位置是“四川省-成都市-青羊工業(yè)區(qū)-成飛路10號(hào)”。
哎~,有意思的地方來(lái)了, 現(xiàn)在我們以虛擬內(nèi)存系統(tǒng)的概念,去套這個(gè)地址。
首先說(shuō)虛擬地址(映射為我們生活上劃分的位置)?!八拇ㄊ 笔且患?jí)頁(yè)表項(xiàng)的偏移地址,一級(jí)頁(yè)表的范圍最大,它有好多個(gè)城市(頁(yè)表項(xiàng));“成都市”是二級(jí)頁(yè)表項(xiàng)的偏移地址,二級(jí)頁(yè)表的范圍次之,它有好多個(gè)區(qū)(頁(yè)表項(xiàng));“青羊工業(yè)區(qū)”是三級(jí)頁(yè)表項(xiàng)的偏移地址,三級(jí)頁(yè)表的范圍已經(jīng)很小了,但是它也有好多條路(頁(yè)表項(xiàng));成飛路就是四級(jí)頁(yè)表項(xiàng)的偏移地址,通過(guò)訪問(wèn)成飛路這個(gè)頁(yè)表項(xiàng),就可以找到它代表的物理頁(yè),里面有很多地址(也就是門(mén)牌號(hào)),目的地在5號(hào),我要住的酒店在10號(hào)。
再說(shuō)對(duì)應(yīng)物理地址。這里從地理角度講,可以劃分為不同的坐標(biāo),這里我們就把四川省劃分為同等大小的區(qū)域,正好被虛擬地址規(guī)定的幾級(jí)頁(yè)表瓜分。這個(gè)區(qū)域(路)就是物理頁(yè),假設(shè)坐標(biāo)的最小尋址單位,就是通過(guò)門(mén)牌號(hào)尋址?,F(xiàn)在,我們?cè)僮兓幌聢D2.2,那么你就可以清晰的認(rèn)識(shí)這個(gè)過(guò)程了。如圖2.3(一定要好好觀察,并結(jié)合我上面的文字走一遍這個(gè)流程,圖中的每一個(gè)箭頭都有意義,應(yīng)該好好研究):
圖 2.3 類(lèi)比地址轉(zhuǎn)換
同樣的道理和方法,就可以找到我酒店的位置,是不是沒(méi)有想象中那么復(fù)雜?而MMU的工作,主要就是做地址的轉(zhuǎn)換、翻譯。在這里,虛擬內(nèi)存系統(tǒng)主要扮演的角色,維護(hù)多級(jí)頁(yè)表,控制虛擬地址的映射范圍。虛擬系統(tǒng)一般是操作系統(tǒng)的組成部分,這部分工作,也可以說(shuō)是操作系統(tǒng)幫我們做了。MMU只需要不停地從頁(yè)表里逐級(jí)查找,得到最后的物理頁(yè),然后結(jié)合虛擬的地址后半部分的頁(yè)偏移,計(jì)算真實(shí)的物理地址。
不知道大家有沒(méi)有注意到,上面我說(shuō)過(guò),“最后一級(jí)頁(yè)表前的所有頁(yè)表,它的頁(yè)表項(xiàng)存放的不一定是物理頁(yè),也可能是下一級(jí)頁(yè)表的“頁(yè)表項(xiàng)的偏移””,反過(guò)來(lái)講,每一級(jí)頁(yè)表項(xiàng),都可以存放物理頁(yè)和下一級(jí)頁(yè)表的地址,這里我們給存放物理頁(yè)的頁(yè)表項(xiàng)叫做塊(Block Entry,簡(jiǎn)稱(chēng)BE);給存放下一級(jí)頁(yè)表地址的頁(yè)表項(xiàng)叫做TE(Table Entry,簡(jiǎn)稱(chēng)TE,中文不知道叫啥)。不同的是,每一級(jí)頁(yè)表項(xiàng)存放的塊,它的大小是不同的。一般一級(jí)頁(yè)表的塊最大,之后逐級(jí)遞減。
最后,大家可以思考一下,頁(yè)表級(jí)數(shù)、塊大小的不同,會(huì)對(duì)地址翻譯產(chǎn)生什么樣的影響?如果我的CPU只有32位,但是我想實(shí)現(xiàn)大于32位地址范圍的虛擬地址訪問(wèn),又該如何操作?
今天先講到這個(gè),以上全當(dāng)一道開(kāi)胃菜兒。關(guān)于MMU的故事,我們娓娓道來(lái)。關(guān)于我上面提出的問(wèn)題,我們將在下一篇文章揭曉,并為大家介紹ARM的MMU是如何工作的。