學習交流加
- 個人qq: 1126137994
- 個人微信: liu1126137994
- 學習交流資源分享qq群: 962535112
上一篇文章學習了(點選連結檢視上一篇文章上一篇文章):
-
虛擬記憶體的概念與交換區的概念
-
MMU的作用
-
虛擬記憶體機制的意義
- 虛擬記憶體作為記憶體管理工具
- 虛擬記憶體作為記憶體保護工具
-
頁表的概念
-
頁命中與缺頁
-
程式的區域性性在虛擬記憶體中的作用
-
MMU的地址翻譯過程
0、回顧
回顧上一篇文章,這裡再補充一下:
- 當頁命中時,CPU硬體執行的步驟
註釋:VA:虛擬地址 PTEA:頁表條目地址 PTE:頁表條目 PA實體記憶體地址
如上圖,CPU的執行步驟如下:
- 處理器生成一個虛擬地址,並把它傳送給MMU
- MMU生成PTE地址,並從快取記憶體/實體記憶體請求得到它
- 快取記憶體/實體記憶體向MMU返回PTE
- MMU根據得到的PTE索引頁表,從而構造實體地址,並把實體地址傳送給快取記憶體/實體記憶體
- 快取記憶體/實體記憶體返回請求的資料或者指令給CPU
- 當缺頁時,CPU的硬體執行過程
註釋:VA:虛擬地址 PTEA:頁表條目地址 PTE:頁表條目
如上圖,CPU的執行步驟如下:
- 處理器生成一個虛擬地址,並把它傳送給MMU
- MMU生成PTE地址,並從快取記憶體/實體記憶體請求得到它
- 快取記憶體/實體記憶體向MMU返回PTE
- PTE中的有效位是0,所以MMU觸發了一次異常,傳遞CPU中的控制到作業系統核心中的缺頁異常處理程式
- 缺頁異常處理程式確定出實體記憶體中的犧牲頁,如果這個頁面被修改了,就將它換出道磁碟
- 缺頁異常處理程式將需要的頁面調入到快取記憶體/實體記憶體,並更新記憶體中的PTE
- 缺頁異常處理程式返回到原來的程式,再次執行導致缺頁的指令。CPU將引起缺頁的地址再次傳送給MMU。因為虛擬頁面現在快取在實體記憶體中了,所以此次就會命中,實體記憶體就會將所請求的資料或者指令返回給CPU
可以看到,頁命中與缺頁的前三步,都是一樣的。我們還可以總結出一個重要的結論: 頁命中完全是由硬體來處理的,而缺頁,卻是由硬體和作業系統核心共同完成的。
1、快取記憶體(Cache)的引入
看看上面分析頁命中與缺頁的過程中,出現了快取記憶體,如果只有實體記憶體很好理解,現在出現快取記憶體是啥意思?
學習過上一篇文章,我們應該可以理解頁命中,缺頁這些簡單的概念以及虛擬地址的定址過程(如果不明白,建議先學習上一篇文章)。
我們知道,CPU定址時,從記憶體中獲取指令與資料的時間還是相當大的(CPU的速度遠遠大於記憶體的速度)。所以快取記憶體(Cache)就出現了。
- Cache是一種小容量高速儲存器
- Cache的存取速度與CPU的運算速度幾乎同量級
- Cache在現代計算機系統中直接內建於處理器晶片中
- 在處理器和記憶體之間設定cache(精確來講是將Cache放在MMU與實體記憶體之間)
- 把記憶體中被頻繁訪問的資料和指令複製到cache中
- 頁表也在記憶體中,將被頻繁訪問的PTE,複製到Cache中
- 大多數情況下,CPU可以直接從cache中取指令與資料
如下圖,我們先來看一個快取記憶體與虛擬記憶體結合的例子,看看此時CPU的訪問過程:
這個圖,其實很好理解!!!當MMU要查詢PTEA以及PA時,都先去快取記憶體中先查一下,看看有沒有,如果快取記憶體中有PTEA與PA,直接從快取記憶體中獲取數相應的PTE與資料。
如果快取記憶體中沒有相應的PTEA或者PA時,就去實體記憶體中獲取,然後從實體記憶體中獲取之後,將獲取到的PTE或者資料再快取到快取記憶體中,然後快取記憶體將獲取到的資料返回給CPU執行。
注意:因為Cache是放在MMU與實體記憶體之間的,所以快取記憶體無需處理保護問題,因為訪問許可權的檢查是MMU地址翻譯過程的一部分。
2、利用TLB加速地址翻譯
學到了這裡,我們應該很清楚地址翻譯的過程了。如果不清楚,就需要看上一篇文章或者深入理解計算機系統第九章。
在地址翻譯的過程中,CPU每產生一個虛擬地址(VP),MMU都要去別的地方查詢一個PTE。這個別的地方指:快取記憶體或者實體記憶體。
在最壞的情況下(缺頁),需要訪問兩次實體記憶體。這種開銷是極其昂貴的。
在最好的情況下,MMU也需要去快取記憶體中獲取PTE對應的值。雖然快取記憶體已經很快了,但是相對於CPU內部來說,還是有點慢。
那麼能不能MMU不去別的地方獲取PTE?能不能在MMU內部也搞一個類似於快取記憶體的東西,來儲存一部分經常被訪問的PTE?答案是可以的!!!
在MMU中,有一個小的快取,稱為翻譯後備緩衝器(TLB)
如下圖示來看看帶有TLB的 MMU,且TLB命中時,是如何執行的
- CPU產生一個虛擬地址
- 第二部和第三部是MMU從TLB中取出相應的PTE
- MMU將這個虛擬地址翻譯成一個實體地址,並將它傳送到快取記憶體/實體記憶體。
- 快取記憶體/實體記憶體將所請求的資料字返回給CPU
我們可以看到,TLB是虛擬定址的快取。
下面再來看看TLB不命中時,是如何執行的
當TLB不命中時,關鍵點在於,MMU必須從L1快取記憶體中獲取到相應的PTE,新取出的PTE再放到TLB中,此時可能會覆蓋一個已經存在的條目。那麼當TLB中有了相應的PTE,MMU再去TLB中查詢......
3、Cache與實體記憶體是如何對映的
這裡我們只學習一下直接對映法:
3.1、直接對映法:
-
將cache和實體記憶體分成固定大小的塊(如512byte/塊)
-
實體記憶體中的每一塊在cache中都有固定的對映位置
-
對應的對映公式為:
- Pos(cache) = 記憶體塊號 % cache總塊數
如圖:
注意:任意一個實體記憶體塊都可以對映到唯一固定的cache塊(實體記憶體不同的塊,可以對映到同一個cache塊)。
3.2、直接對映原理
比如我們想要訪問某一個實體地址,我們如何知道這個地址是否在cache中?或者如何知道它在cache中的位置?
首先,現在只有一個實體地址,需要根據這個實體地址進行判斷。
看下面,對實體地址有一個劃分:
以上的實體地址分為3部分,都是什麼意思呢?我們利用以下規則來判斷;
-
根據實體地址的中間的c位,找到cache中對應的塊
-
比較實體地址的高t位,讓它與cache中的flag比較,看是否相同
- 如果相同:說明資料在快取記憶體中有快取,那麼此時根據實體記憶體的b位找到cache對應的塊中的偏移
- 如果不同:說明資料在快取中沒有快取,此時就將實體記憶體中對應的資料複製到cache中
比如下面這個例子:
3.3、直接對映法的特點
我們已經知道,直接對映法,很有可能不同的實體記憶體塊對映到相同的cache塊。所以直接對映法這樣會導致快取失效。但是直接對映法過程簡單,所需耗時短!!
4、總結
下面籠統的用流程圖概括一下處理器的資料訪問過程:
本篇文章學會了以下內容;
- 快取記憶體的作用
- TLB的作用
- 實體記憶體與cache之間的對映原理