【軟體開發底層知識修煉】四 深入淺出處理器之四 結合快取記憶體以及TLB與虛擬記憶體

楊柳_發表於2019-01-25

學習交流加

  • 個人qq: 1126137994
  • 個人微信: liu1126137994
  • 學習交流資源分享qq群: 962535112

上一篇文章學習了(點選連結檢視上一篇文章上一篇文章):

  • 虛擬記憶體的概念與交換區的概念

  • MMU的作用

  • 虛擬記憶體機制的意義

    • 虛擬記憶體作為記憶體管理工具
    • 虛擬記憶體作為記憶體保護工具
  • 頁表的概念

  • 頁命中與缺頁

  • 程式的區域性性在虛擬記憶體中的作用

  • MMU的地址翻譯過程

0、回顧

回顧上一篇文章,這裡再補充一下:

  • 當頁命中時,CPU硬體執行的步驟

在這裡插入圖片描述

註釋:VA:虛擬地址 PTEA:頁表條目地址 PTE:頁表條目 PA實體記憶體地址

如上圖,CPU的執行步驟如下:

  1. 處理器生成一個虛擬地址,並把它傳送給MMU
  2. MMU生成PTE地址,並從快取記憶體/實體記憶體請求得到它
  3. 快取記憶體/實體記憶體向MMU返回PTE
  4. MMU根據得到的PTE索引頁表,從而構造實體地址,並把實體地址傳送給快取記憶體/實體記憶體
  5. 快取記憶體/實體記憶體返回請求的資料或者指令給CPU
  • 當缺頁時,CPU的硬體執行過程

在這裡插入圖片描述

註釋:VA:虛擬地址 PTEA:頁表條目地址 PTE:頁表條目

如上圖,CPU的執行步驟如下:

  1. 處理器生成一個虛擬地址,並把它傳送給MMU
  2. MMU生成PTE地址,並從快取記憶體/實體記憶體請求得到它
  3. 快取記憶體/實體記憶體向MMU返回PTE
  4. PTE中的有效位是0,所以MMU觸發了一次異常,傳遞CPU中的控制到作業系統核心中的缺頁異常處理程式
  5. 缺頁異常處理程式確定出實體記憶體中的犧牲頁,如果這個頁面被修改了,就將它換出道磁碟
  6. 缺頁異常處理程式將需要的頁面調入到快取記憶體/實體記憶體,並更新記憶體中的PTE
  7. 缺頁異常處理程式返回到原來的程式,再次執行導致缺頁的指令。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命中時,是如何執行的

在這裡插入圖片描述

  1. CPU產生一個虛擬地址
  2. 第二部和第三部是MMU從TLB中取出相應的PTE
  3. MMU將這個虛擬地址翻譯成一個實體地址,並將它傳送到快取記憶體/實體記憶體。
  4. 快取記憶體/實體記憶體將所請求的資料字返回給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之間的對映原理

相關文章