国产成年女人特黄特色毛片免_日本亚洲国产中文一区二区三区_国产精品福利一区_亚洲MA无码免费观看_欧美日韩一卡2卡三卡4卡乱码视频

焦點 >

ARMv8-A 地址翻譯技術(shù)之MMU的前世今生

時間:2023-05-06 20:23:53       來源:清一色財經(jīng)

頁表級數(shù)、塊大小的不同,會對地址翻譯產(chǎn)生什么樣的影響?如果我的CPU只有32位,但是我想實現(xiàn)大于32位地址范圍的虛擬地址訪問,又該如何操作?

MMU的重要性不言而喻,支撐操作系統(tǒng)之上的各種復(fù)雜應(yīng)用。但在正式講MMU之前,我們先說說MMU的發(fā)展史,因為ARMv8-A的MMU相當(dāng)復(fù)雜,直接切入正題,會顯得比較枯燥。廢話不多說,咱們馬上開始:


(資料圖片)

一、前言

關(guān)于虛擬內(nèi)存系統(tǒng)的演變史,MMU在其中扮演了什么樣的角色。

早期計算機是沒有MMU的概念的,也沒有對存儲器的抽象,直接將物理內(nèi)存暴露給程序用。那個時候硬件資源有限,大家都勒緊褲腰帶寫程序,不敢多浪費一個字節(jié)。我曾經(jīng)規(guī)劃過一個游戲掌機的開源項目,將早期的街機游戲移植到現(xiàn)代硬件上。

在調(diào)研階段我就發(fā)現(xiàn),這些程序都很小,只有十幾KB,但無一例外,都是對內(nèi)存進行直接操作(有點類似單片機/微控制器編程)。

圖 1.1 GAME BOY 掌機

但在那個年代,硬件的迭代速度不如軟件快,而彼時的代碼業(yè)務(wù)邏輯已經(jīng)相當(dāng)復(fù)雜,程序的體積呈指數(shù)級增長。

所以早期開發(fā)人員,為了使得越來越龐大的程序,能夠在資源有限的硬件上運行,發(fā)明了ovelay-覆蓋塊技術(shù),對程序進行分割、分段運行。

但這招治標(biāo)不治本,并不能保證程序運行的足夠順暢,反而要為程序分段,增加的額外的工作量,這是一件相當(dāng)痛苦的事情。所以開發(fā)人員把目光看向了硬件,決定從軟硬兩個方向下手。

說到這里,就不得不提一下早期的虛擬化技術(shù)。該技術(shù)的硬件虛擬化方向,為以后MMU的發(fā)展奠定了基礎(chǔ)。

“硬件虛擬化”在狹義上是對內(nèi)存、硬盤等硬件做虛擬化處理(軟件為主),配合操作系統(tǒng)以達(dá)到分時復(fù)用的效果。1964 年,IBM 推出了大名鼎鼎的System/360。它不僅提供了新型的操作系統(tǒng),還實現(xiàn)了基于全硬件虛擬化(Full Hardware Virtualization)的虛擬機解決方案。

圖 1.2 IBM? 員工在調(diào)試機器

這其中就包括頁式虛擬內(nèi)存(4k 分頁虛擬存儲系統(tǒng))、虛擬磁盤以及 TSS 分時系統(tǒng)。System/360 最多可提供14個虛擬機,每個虛擬機具有 256k固定虛擬內(nèi)存。有意思的是,System/360 的開發(fā)過程被視為了計算機發(fā)展史上最大的一次豪賭,為了研發(fā) System/360,IBM決定征召六萬多名新員工,創(chuàng)建了五座新工廠。即便如此,當(dāng)時的出貨時間仍被不斷順延。

在后續(xù)的計算機發(fā)展中,內(nèi)存被操作系統(tǒng)抽象出來,作為地址空間進行統(tǒng)一管理,按需分配給應(yīng)用程序使用。這樣作為內(nèi)存的硬件細(xì)節(jié)(容量/類型/廠商/…)被操作系統(tǒng)隱藏了,程序只需要關(guān)心地址空間就可以。

同時操作系統(tǒng)引入了虛擬化技術(shù),可以對內(nèi)存進行”擴容”,本質(zhì)是對內(nèi)存的分時復(fù)用,讓每個程序認(rèn)為自己獨占了整個地址空間。但是這樣做效率并不高,因為操作系統(tǒng)需要不斷地做內(nèi)存搬運。并且操作系統(tǒng)還要為內(nèi)存的管理算法,付出許多額外的計算(比如地址翻譯),非常浪費性能。

所以我們就需要設(shè)計硬件,來代替一些比較繁瑣復(fù)雜的流程。最好能形成標(biāo)準(zhǔn)流程化操作,這樣做成的硬件,可以持續(xù)優(yōu)化(GPU也是這么出現(xiàn)的)。

因此,MMU誕生了,它接替了操作系統(tǒng)內(nèi)存管理的比較復(fù)雜的部分,比如地址翻譯;內(nèi)存訪問效率,則交給了cache(高速緩存)去做,或者提高內(nèi)存總線的帶寬。

在現(xiàn)代操作系統(tǒng)中,衍生了一種更先進的內(nèi)存管理技術(shù),叫做虛擬內(nèi)存系統(tǒng),這是對主存的一種抽象概念。它由硬件異常、物理地址翻譯、主存、磁盤文件和內(nèi)核軟件相互配合,共同組成。

虛擬內(nèi)存系統(tǒng)主要提供了三種能力:

1.提供主存的高速緩存,加快內(nèi)存訪問速度(高速緩存);

2.為每個進程提供一致的地址空間,從而簡化內(nèi)存管理;

3.防止每個進程的地址空間被其他進程所破壞(內(nèi)存保護)。

圖 1.3 虛擬內(nèi)存系統(tǒng)簡易圖

MMU的作用,就是將虛擬地址翻譯成物理地址。簡單來說,CPU會生成一個虛擬地址(VirtualAddress)來訪問主存(這個地址實際上是操作系統(tǒng)來產(chǎn)生的,最后交給CPU執(zhí)行)。訪問之前,需要先將虛擬地址轉(zhuǎn)換為物理地址,這個過程稱作為地址轉(zhuǎn)換(地址映射/地址翻譯)。

為進行此操作,需要CPU硬件和操作系統(tǒng)合作,通過內(nèi)存管理單元(Memory ManagementUnit)上的硬件翻譯地址,來完成虛擬地址到物理地址的轉(zhuǎn)換。MMU利用存儲在主存上的查詢表(translationtable)來翻譯虛擬地址,該表的內(nèi)容由操作系統(tǒng)維護和管理。

圖 1.4 MMU地址翻譯/轉(zhuǎn)換簡化流程

說到這里,你可能對MMU的描述感到云里霧里,但不要緊,接下來我們會對它抽絲剝繭,一點點講清楚。不過我們還需要對操作系統(tǒng)的虛擬內(nèi)存系統(tǒng),做一些更詳細(xì)的講解,這樣再看MMU,就會非常輕松了。記住,這個先后順序非常重要。

二、虛擬內(nèi)存系統(tǒng)的原理

這里我們只探討虛擬內(nèi)存系統(tǒng)如何管理虛擬內(nèi)存的,關(guān)于cache部分,我們另說。

一般虛擬內(nèi)存系統(tǒng)會將虛擬內(nèi)存,劃分為固定大小的塊(又叫做最小粒度,一般有4KB、16KB、64KB等大小,其中4KB最流行),這個塊我們稱作為虛擬頁(VirtualPage簡稱VP),同理將物理內(nèi)存劃分為物理頁(Physical Page簡稱PP),也叫頁幀(Page Frame)。

每個虛擬頁的首地址,會被維護在一個表內(nèi),這個表叫做查詢表或頁表(Page Table,簡稱PT),頁表內(nèi)的每一個條目,被稱為頁表項(Page TableEntry,簡稱PTE)。

這個頁表可能有多級,一般來說,級數(shù)越多,能覆蓋的虛擬地址范圍就越大。在多級頁表當(dāng)中,除最后一級頁表之外的所有頁表,它的頁表項存放的不一定是物理頁,也可能是下一級頁表的地址。

圖 2.1 虛擬內(nèi)存系統(tǒng)的地址翻譯/轉(zhuǎn)換流程

在這個基礎(chǔ)上,虛擬系統(tǒng)會產(chǎn)生一個虛擬地址,由虛頁號+頁偏移組成。虛頁號存放的一般是頁表項的偏移地址(也可能是多級頁表的組合),通過對頁表的不斷查詢,最后找到對應(yīng)的物理頁(的首地址),然后加上虛擬地址的頁偏移,就能順利計算出真實的物理地址。如圖2.2所示:

圖 2.2 虛擬內(nèi)存系統(tǒng)的地址翻譯/轉(zhuǎn)換詳細(xì)流程

這個流程,可以用一個很恰當(dāng)?shù)睦尤ッ枋?,就是在地圖軟件上找一個地方兒。

以我在地圖上找酒店入住為例,目的地在“四川省-成都市-青羊工業(yè)區(qū)-成飛路-5號”。于是,我通過手機軟件,找到一家到酒店,位置是“四川省-成都市-青羊工業(yè)區(qū)-成飛路10號”。

哎~,有意思的地方來了, 現(xiàn)在我們以虛擬內(nèi)存系統(tǒng)的概念,去套這個地址。

首先說虛擬地址(映射為我們生活上劃分的位置)?!八拇ㄊ 笔且患夗摫眄椀钠频刂?,一級頁表的范圍最大,它有好多個城市(頁表項);“成都市”是二級頁表項的偏移地址,二級頁表的范圍次之,它有好多個區(qū)(頁表項);“青羊工業(yè)區(qū)”是三級頁表項的偏移地址,三級頁表的范圍已經(jīng)很小了,但是它也有好多條路(頁表項);成飛路就是四級頁表項的偏移地址,通過訪問成飛路這個頁表項,就可以找到它代表的物理頁,里面有很多地址(也就是門牌號),目的地在5號,我要住的酒店在10號。

再說對應(yīng)物理地址。這里從地理角度講,可以劃分為不同的坐標(biāo),這里我們就把四川省劃分為同等大小的區(qū)域,正好被虛擬地址規(guī)定的幾級頁表瓜分。這個區(qū)域(路)就是物理頁,假設(shè)坐標(biāo)的最小尋址單位,就是通過門牌號尋址?,F(xiàn)在,我們再變化一下圖2.2,那么你就可以清晰的認(rèn)識這個過程了。

如圖2.3(一定要好好觀察,并結(jié)合我上面的文字走一遍這個流程,圖中的每一個箭頭都有意義,應(yīng)該好好研究):

圖 2.3 類比地址轉(zhuǎn)換

同樣的道理和方法,就可以找到我酒店的位置,是不是沒有想象中那么復(fù)雜?而MMU的工作,主要就是做地址的轉(zhuǎn)換、翻譯。在這里,虛擬內(nèi)存系統(tǒng)主要扮演的角色,維護多級頁表,控制虛擬地址的映射范圍。虛擬系統(tǒng)一般是操作系統(tǒng)的組成部分,這部分工作,也可以說是操作系統(tǒng)幫我們做了。MMU只需要不停地從頁表里逐級查找,得到最后的物理頁,然后結(jié)合虛擬的地址后半部分的頁偏移,計算真實的物理地址。

不知道大家有沒有注意到,上面我說過,“最后一級頁表前的所有頁表,它的頁表項存放的不一定是物理頁,也可能是下一級頁表的“頁表項的偏移””,反過來講,每一級頁表項,都可以存放物理頁和下一級頁表的地址,這里我們給存放物理頁的頁表項叫做塊(BlockEntry,簡稱BE);給存放下一級頁表地址的頁表項叫做TE(TableEntry,簡稱TE,中文不知道叫啥)。不同的是,每一級頁表項存放的塊,它的大小是不同的。一般一級頁表的塊最大,之后逐級遞減。

最后,大家可以思考一下,頁表級數(shù)、塊大小的不同,會對地址翻譯產(chǎn)生什么樣的影響?如果我的CPU只有32位,但是我想實現(xiàn)大于32位地址范圍的虛擬地址訪問,又該如何操作?

今天先講到這個,以上全當(dāng)一道開胃菜兒。關(guān)于MMU的故事,我們娓娓道來。關(guān)于我上面提出的問題,我們將在下一篇文章揭曉,并為大家介紹ARM的MMU是如何工作的。

關(guān)鍵詞:

首頁
頻道
底部
頂部