MMU內存管理單元介紹

前言

  本篇文章簡要闡述MMU的概念,以及以段地址的轉換過程爲例,簡單說明MMU將虛擬地址轉換成物理地址的過程。更多詳細內容請查看《ARM-MMU(中文手冊).pdf》

1、MMU概述

  在ARM存儲系統中,使用MMU實現虛擬地址到實際物理地址的映射。爲何要實現這種映射?
  首先就要從一個嵌入式系統的基本構成和運行方式着手。系統上電時,處理器的程序指針從0x0(或者是由0Xffff_0000處高端啓動)處啓動,順序執行程序,在程序指針(PC)啓動地址,屬於非易失性存儲器空間範圍,如ROM、FLASH等。然而與上百兆的嵌入式處理器相比,FLASH、ROM等存儲器響應速度慢,已成爲提高系統性能的一個瓶頸。而SDRAM具有很高的響應速度,爲何不使用SDRAM來執行程序呢?爲了提高系統整體速度,可以這樣設想,利用FLASH、ROM對系統進行配置,把真正的應用程序下載到SDRAM中運行,這樣就可以提高系統的性能。然而這種想法又遇到了另外一個問題,當ARM處理器響應異常事件時,程序指針將要跳轉到一個確定的位置,假設發生了IRQ中斷,PC將指向0x18(如果爲高端啓動,則相應指向0vxffff_0018處),而此時0x18處仍爲非易失性存儲器所佔據的位置,則程序的執行還是有一部分要在FLASH或者ROM中來執行的。那麼我們可不可以使程序完全都SDRAM中運行那?答案是肯定的,這就引入了MMU,利用MMU,可把SDRAM的地址完全映射到0x0起始的一片連續地址空間,而把原來佔據這片空間的FLASH或者ROM映射到其它不相沖突的存儲空間位置。例如,FLASH的地址從0x0000_0000-0x00ff_ffff,而SDRAM的地址範圍是0x3000_0000-0x31ff_ffff,則可把SDRAM地址映射爲0x0000_0000-0x1fff_ffff而FLASH的地址可以映射到0x9000_0000-0x90ff_ffff(此處地址空間爲空閒,未被佔用)。映射完成後,如果處理器發生異常,假設依然爲IRQ中斷,PC指針指向0x18處的地址,而這個時候PC實際上是從位於物理地址的0x3000_0018處讀取指令。通過MMU的映射,則可實現程序完全運行在SDRAM之中。
  在實際的應用中,可能會把兩片不連續的物理地址空間分配給SDRAM。而在操作系統中,習慣於把SDRAM的空間連續起來,方便內存管理,且應用程序申請大塊的內存時,操作系統內核也可方便地分配。通過MMU可實現不連續的物理地址空間映射爲連續的虛擬地址空間。
  操作系統內核或者一些比較關鍵的代碼,一般是不希望被用戶應用程序所訪問的。通過MMU可以控制地址空間的訪問權限,從而保護這些代碼不被破壞。

2、MMU地址映射的實現

  MMU的實現過程,實際上就是一個查表映射的過程。建立頁表(translate table)是實現MMU功能不可缺少的一步。頁表是位於系統的內存中,頁表的每一項對應於一個虛擬地址到物理地址的映射。每一項的長度即是一個字的長度(在ARM中,一個字的長度被定義爲4字節)。頁表項除完成虛擬地址到物理地址的映射功能之外,還定義了訪問權限和緩衝特性等。

2.1 映射存儲塊的分類 

  MMU 支持基於節或頁的存儲器訪問, MMU 可以用下面四種大小進行映射:
  節 ( Section ) 構成 1MB 的存儲器塊。
  微頁 ( Tiny page ) 構成 1KB 的存儲器塊。
  小頁 ( Small page ) 構成 4KB 的存儲器塊。
  大頁 ( Large page ) 構成 64KB 的存儲器塊。
  其中對於節映射使用一級轉換表就可以了,而對於微頁、小頁、大頁則需要使用兩級轉換表。

2.2 轉換過程 

  要知道虛擬內存機制必須瞭解ARM9中的3種地址:VA(虛地址),MVA(修正後虛地址),PA(物理地址)
  1)VA,是程序中的邏輯地址,0x00000000~0xFFFFFFFF。
  2)MVA,是修改後的虛擬地址。在ARM9裏面,如果VA<32M,利用進程標識號PID轉換得到MVA。過程如下:

if(VA < 32M)
     MVA = VA | ( PID<<25 )
else
     MVA = VA

  只是上面的過程是由硬件實現的。這樣爲VA進行了一級映射,爲什麼呢?在linux系統裏,每個進程的地址空間0-4G,0-3G是進程獨有的,稱爲用戶空間,3G-4G是系統的,稱爲內核空間,所有進程共享。如果兩個進程所用的VA有重疊,在切換進程時,爲了把重疊的VA映射到不同的PA上,需要重建頁表、使無效caches和TLBS。使用了MVA,使進程在VA相同的情況下,使用不同的MVA,進而PA也不同。這就是在VA與PA之間加上一次到MVA的映射的意義。
  3)PA,物理地址,MVA通過MMU轉換後的地址。
這裏寫圖片描述
  
  一級頁表使用 4096 個描述符來表示 4GB 空間,每個描述符對應 1MB 的虛擬地址,存儲它對應的 1MB 物理空間的起始地址,或者存儲下一級頁表的地址。每個描述符佔 4 個字節,格式如下:
這裏寫圖片描述
  
  使用 MVA[31:20]來索引一級頁表(20-31 一共 12 位,2^12=4096,所以是4096 個描述符)。其中段地址的轉換流程如下圖所示:
這裏寫圖片描述
  ①頁表基址寄存器位[31:14]和 MVA[31:20]組成一個低兩位爲 0 的 32 位地址, MMU 利用這個地址找到段描述符。
  ②取出段描述符的位[31:20](段基址,section base address),它和 MVA[19:0]組成一個 32 位的物理地址(這就是 MVA 對應的 PA)

2.3 TLB

  從MVA 到 PA 的轉換需要訪問多次內存,大大降低了 CPU 的性能,有沒有辦法改進呢?
  程序執行過程中,用到的指令和數據的地址往往集中在一個很小的範圍內,其中的地址、數據經常使用,這是程序訪問的局部性。由此,通過使用一個高速、容量相對較小的存儲器來存儲近期用到的頁表條目(段、大頁、小頁、極小頁描述符),避免每次地址轉換都到主存中查找,這樣就大幅提高性能。這個存儲器用來幫助快速地進行地址轉換,成爲轉譯查找緩存(Translation Lookaside Buffers, TLB)。
  當 CPU 發出一個虛擬地址時,MMU 首先訪問 TLB。如果 TLB 中含有能轉換這個虛擬地址的描述符,則直接利用此描述符進行地址轉換和權限檢查,否則 MMU 訪問頁表找到描述符後再進行地址轉換和權限檢查,並將這個描述符填入TLB 中,下次再使用這個虛擬地址時就直接使用 TLB 用的描述符。
  若轉換成功,則稱爲”命中”。Linux 系統中,目前的”命中”率高達 90%以上,使分頁機制帶來的性能損失降低到了可接收的程度。若在 TLB 中進行查錶轉換失敗,則退縮爲一般的地址變換,概率小於 10%。

發佈了57 篇原創文章 · 獲贊 80 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章