成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

商務辦公
頁表級數、塊大小的不同,會對地址翻譯產生什么樣的影響?如果我的CPU只有32位,但是我想實現大于32位地址范圍的虛擬地址訪問,又該如何操作?

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

一、前言

關于虛擬內存系統的演變史,MMU在其中扮演了什么樣的角色。

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

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

圖 1.1 GAME BOY 掌機

但在那個年代,硬件的迭代速度不如軟件快,而彼時的代碼業務邏輯已經相當復雜,程序的體積呈指數級增長。

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

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

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

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

圖 1.2 IBM? 員工在調試機器

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

在后續的計算機發展中,內存被操作系統抽象出來,作為地址空間進行統一管理,按需分配給應用程序使用。這樣作為內存的硬件細節(容量/類型/廠商/...)被操作系統隱藏了,程序只需要關心地址空間就可以。

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

所以我們就需要設計硬件,來代替一些比較繁瑣復雜的流程。最好能形成標準流程化操作,這樣做成的硬件,可以持續優化(GPU也是這么出現的)。

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

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

虛擬內存系統主要提供了三種能力:

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

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

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

圖 1.3 虛擬內存系統簡易圖

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

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

圖 1.4 MMU地址翻譯/轉換簡化流程

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

二、虛擬內存系統的原理

這里我們只探討虛擬內存系統如何管理虛擬內存的,關于cache部分,我們另說。

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

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

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

圖 2.1 虛擬內存系統的地址翻譯/轉換流程

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

圖 2.2 虛擬內存系統的地址翻譯/轉換詳細流程

這個流程,可以用一個很恰當的例子去描述,就是在地圖軟件上找一個地方兒。

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

哎~,有意思的地方來了, 現在我們以虛擬內存系統的概念,去套這個地址。

首先說虛擬地址(映射為我們生活上劃分的位置)。“四川省”是一級頁表項的偏移地址,一級頁表的范圍最大,它有好多個城市(頁表項);“成都市”是二級頁表項的偏移地址,二級頁表的范圍次之,它有好多個區(頁表項);“青羊工業區”是三級頁表項的偏移地址,三級頁表的范圍已經很小了,但是它也有好多條路(頁表項);成飛路就是四級頁表項的偏移地址,通過訪問成飛路這個頁表項,就可以找到它代表的物理頁,里面有很多地址(也就是門牌號),目的地在5號,我要住的酒店在10號。

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

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

圖 2.3 類比地址轉換

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

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

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

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

責任編輯:武曉燕 來源: 一口Linux
相關推薦

2018-01-31 11:17:59

虛擬化技術硬件

2022-09-14 21:15:44

互聯網存儲技術

2023-08-16 14:56:07

2011-08-23 09:52:31

CSS

2015-11-18 14:14:11

OPNFVNFV

2014-07-30 10:55:27

2025-02-12 11:25:39

2010-05-07 09:33:28

GNU GPL開源許可協議

2014-07-21 12:57:25

諾基亞微軟裁員

2019-06-04 09:00:07

Jenkins X開源開發人員

2014-07-15 10:31:07

asyncawait

2016-12-29 18:21:01

2021-06-17 07:08:19

Tapablewebpack JavaScript

2016-12-29 13:34:04

阿爾法狗圍棋計算機

2012-05-18 16:54:21

FedoraFedora 17

2013-05-23 16:23:42

Windows Azu微軟公有云

2016-11-03 13:33:31

2016-11-08 19:19:06

2021-04-15 07:01:28

區塊鏈分布式DLT

2011-05-13 09:43:27

產品經理PM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91操操操 | 97超碰人人草 | 国产精品69毛片高清亚洲 | 久久久久久久久久一区二区 | 亚洲精品一 | 亚洲码欧美码一区二区三区 | 国产丝袜一区二区三区免费视频 | 国产精品视频网 | 午夜视频网站 | 在线观看a视频 | 日韩精品视频在线观看一区二区三区 | 日本国产精品视频 | 一级国产精品一级国产精品片 | www.亚洲精品 | 99久久久久久久久 | 国产精品国产精品国产专区不蜜 | 手机av网 | 亚洲视频免费 | 日韩精品久久久久 | 精品99在线 | 亚洲精品一区二区网址 | 亚洲国产精品一区在线观看 | 九九久久99 | 亚洲免费精品一区 | 免费看黄色片 | 亚洲毛片在线 | 色婷婷av久久久久久久 | 操久久 | 久久国产精品一区二区 | 欧美一级三级 | 一区二区三区在线看 | 亚洲三级在线观看 | 亚洲在线一区 | 91麻豆精品国产91久久久久久 | 欧美日韩一区二区在线播放 | 久久久久久久久精 | 国产9999精品 | 福利视频大全 | 亚洲精品电影网在线观看 | 国产精品一区二区免费看 | 日本综合在线观看 |