最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

簡單寫寫給新手的MMU工作原理!

2023-03-17 14:16 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

很多人接觸Linux的內(nèi)存管理是從malloc()這個C語言庫函數(shù)開始,也是從那時開始就知道了虛擬內(nèi)存的概念。但很多人可能并不知道虛擬地址是如何轉(zhuǎn)換成物理地址的,今天帶你搞懂虛擬地址到物理地址的轉(zhuǎn)換過程,這其實也是MMU的工作原理。

1、預(yù)備知識

我們知道,在Linux中,每個進(jìn)程都有自己獨立的地址空間,且互不干擾。每個進(jìn)程的地址空間又分為用戶空間和內(nèi)核空間,但這些地址空間使用的都是虛擬地址,它們和物理地址空間關(guān)系是怎樣的呢?虛擬地址空間和物理地址空間的關(guān)系如下:

對于不同的進(jìn)程,面對的都是同一個內(nèi)核,其內(nèi)核空間的地址對應(yīng)的物理地址都是一樣的,因此進(jìn)程1和進(jìn)程2中內(nèi)核空間都映射到了相同的物理內(nèi)存PA1上。

而不同進(jìn)程的用戶空間是不一樣的,即便相同的虛擬地址,也會被映射到不同的物理地址上。如圖中兩個進(jìn)程相同用戶空間的地址0x123456分別被映射到了PA2PA3物理地址上。

那么如何完成上述虛擬地址到物理地址的轉(zhuǎn)換呢?

完成虛擬地址到物理地址的轉(zhuǎn)換,我們需要借助一個硬件——MMU。

MMU: Memory manager unit,內(nèi)存管理單元,負(fù)責(zé)將虛擬地址(VA)轉(zhuǎn)為物理地址(PA)。

在介紹MMU是如何將虛擬地址轉(zhuǎn)為物理地址之前,我們需要了解一些內(nèi)存管理機(jī)制。

2、分頁機(jī)制

在Linux系統(tǒng)上,現(xiàn)在用到的內(nèi)存管理機(jī)制,大部分是分頁機(jī)制。在分頁機(jī)制出現(xiàn)之前,還出現(xiàn)過動態(tài)分區(qū)法、分段機(jī)制。

動態(tài)分區(qū)法是還沒用引入虛擬地址之前使用的,使用的都是物理內(nèi)存,屬于非常早期的機(jī)制。分段機(jī)制則引入了虛擬地址的概念,而分頁機(jī)制在分段機(jī)制后出現(xiàn),主要解決分段機(jī)制內(nèi)存碎片的問題。本篇以分頁機(jī)制講解虛擬地址到物理地址的轉(zhuǎn)換,下面介紹分頁機(jī)制的一些基本概念。

分頁機(jī)制的基本概念:

  • 分頁:將內(nèi)存劃分為固定長度的單元,每個單元就是一頁

  • :對于虛擬地址空間,將地址空間劃分為固定大小單元的單元,每個單元稱為一頁

  • 頁幀:對于物理地址空間,將地址空間分為固定大小的單元,每個單元稱為頁幀

  • VPN:Virtual Page Number,虛擬頁面號

  • PFN:Physical Frame Number,物理頁幀號

分頁管理內(nèi)存的核心問題就是虛擬地址頁到物理地址頁幀的映射關(guān)系

3、虛擬地址到物理地址轉(zhuǎn)換過程

虛擬地址和物理地址都被劃分了兩部分:

虛擬地址由虛擬頁面號VPN和虛擬地址偏移VA offset兩部分組成。同樣,物理地址由物理頁幀號PFN和物理地址偏移PA offset兩部分組成。

虛擬地址轉(zhuǎn)換成物理地址時,需要將VPN轉(zhuǎn)成PFN。PA offset通常就是VA offset。

所以物理地址 =?PFN?+?VA offset

這里的核心就是VPN到PFN的映射,而VPN到PFN的映射關(guān)系是通過頁表記錄。就是說,頁表存儲了VPN和PFN的映射關(guān)系,MMU根據(jù)VPN,在頁表中找到PFN,再把PFN和VA offset相加,就得到了物理地址,從而將虛擬地址轉(zhuǎn)為物理地址。

這里要區(qū)分一下,頁表存儲了VA到PA的映射關(guān)系,所以說找到頁表就找到了物理地址。但是這個頁表是軟件提供的,MMU只負(fù)責(zé)將虛擬地址翻譯成物理地址,翻譯的依據(jù)就是頁表,MMU本身不負(fù)責(zé)創(chuàng)建頁表。所以說,在開啟MMU之前,系統(tǒng)就要提前建立好虛擬地址到物理地址的映射關(guān)系,然后保存到頁表中,這樣開啟MMU時,MMU才能正確找到對應(yīng)的物理地址。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ?

4、頁表在哪

頁表都存儲在物理內(nèi)存中, MMU將虛擬地址轉(zhuǎn)換為物理地址,需要訪問物理內(nèi)存中對應(yīng)的頁表。

實際上,頁表通常就是用一個數(shù)組來表示。

這里可能會一些疑問:

疑問:放到物理內(nèi)存,每次轉(zhuǎn)換都要訪問內(nèi)存,速度不慢嗎?

答:慢。怎么解決呢?如果有cache是不是就很快了?是的,這塊cache就叫TLB。

疑問:都放到物理內(nèi)存,占用物理內(nèi)存空間不大嗎?

答:大,怎么解決?多級頁表+缺頁異常!多級頁表可以減少內(nèi)存占用,而通常只需將一級頁表存儲到物理內(nèi)存,查找的時候,找不到二級頁表,觸發(fā)一個缺頁異常,這時再分配頁表,從而節(jié)省內(nèi)存。

關(guān)于頁表放到物理內(nèi)存的問題,涉及到cache和其他的一些知識,內(nèi)容很多且比較復(fù)雜,暫時不深究,知道頁表是放在內(nèi)存中的即可。

5、MMU如何知道頁表在哪

前面說頁表存儲在物理內(nèi)存中,那么MMU怎么知道這個頁表在內(nèi)存中的具體地址呢?

通常CPU會提供一個頁表基址寄存器給操作系統(tǒng)使用,用于給MMU指示頁表的基地址。不同處理器架構(gòu)對應(yīng)的寄存器也不一樣:

x86:CR3(Control Register 3)

ARM-v8:系統(tǒng)寄存器TTBR(Translation Table Base egister)

RISC-V:SATP(Supervisor Address Translation and Protection)

頁表基址寄存器存儲了第一級頁表的基地址,通過訪問該寄存器,就能知道頁表在那個位置。

6、多級頁表轉(zhuǎn)換過程

實際使用中,都是用多級頁表來存儲虛擬地址和物理地址的映射關(guān)系,

以二級頁表為例(假設(shè)是32位系統(tǒng)),其虛擬地址轉(zhuǎn)換為物理地址的過程如圖所示:

PGD:Pgea Global Directory,全局頁目錄,存儲了下一級頁表的基地址

PTE:Page Table Entrys,頁表入口,PTE才是真正存儲了物理地址的頁表

VA到PA的轉(zhuǎn)換過程

MMU通過訪問頁表基址寄存器,得到一級頁表PGD的基地址,再結(jié)合虛擬地址中的PGD index找到了下一級頁表PTE的基地址;得到了PTE的基址,再結(jié)合虛擬地址中的PTE index找到PFN,然后再和VA相加得到物理地址。

這里需要注意,使用多少級的頁表、以及虛擬地址、物理地址的格式、PTE的格式等等,與32系統(tǒng)還是64位系統(tǒng)有關(guān),也與處理器的架構(gòu)有關(guān),需要根據(jù)不同系統(tǒng)、不同處理器架構(gòu)分析。

但是MMU工作原理都是一樣的,不管是二級頁表、三級頁表還是四級頁表,都是通過第一級頁表找到第二級頁表,通過第二級頁表找到第三級頁表......最終找到物理地址。只要明白了MMU的工作原理,分析其他的頁表也是大同小異。

總結(jié)

本文帶大家了解了虛擬地址和物理地址的一些概念,以及MMU將虛擬地址轉(zhuǎn)為物理地址的過程,相信通過以上內(nèi)容,對虛擬地址、物理地址、MMU、多級頁表等這些概念都不陌生了。


原文作者:嵌入式Linux充電站


簡單寫寫給新手的MMU工作原理!的評論 (共 條)

分享到微博請遵守國家法律
石棉县| 墨玉县| 崇仁县| 建阳市| 兴安县| 保康县| 望都县| 墨脱县| 潮安县| 太仆寺旗| 威海市| 漳平市| 商丘市| 澜沧| 陆丰市| 阳春市| 明溪县| 金昌市| 温州市| 南召县| 滦南县| 利津县| 无棣县| 马边| 雷山县| 永福县| 高密市| 新营市| 浦江县| 四会市| 从江县| 栖霞市| 赞皇县| 莱州市| 徐闻县| 界首市| 桃园市| 大庆市| 兴城市| 石城县| 平和县|