MMU內存管理單元相關知識點總結

1.MMU是Memory Management Unit的縮寫,中文名是內存管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射爲物理地址,以及提供硬件機制的內存訪問受權,多用戶多進程操做系統。程序員

 

2.虛擬內存由來:許多年之前,當人們還在使用DOS或是更古老的操做系統的時候,計算機的內存還很是小,通常都是以K爲單位進行計算,相應的,當時的程序規模也不大,因此內存容量雖然小,但仍是能夠容納當時的程序。但隨着圖形界面的興起還有用戶需求的不斷增大,應用程序的規模也隨之膨脹起來,終於一個難題出如今程序員的面前,那就是應用程序太大以致於內存容納不下該程序,一般解決的辦法是把程序分割成許多稱爲覆蓋塊(overlay)的片斷。覆蓋塊0首先運行,結束時他將調用另外一個覆蓋塊。雖然覆蓋塊的交換是由OS完成的,可是必須先由程序員把程序先進行分割,這是一個費時費力的工做,並且至關枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是虛擬存儲器(virtual memory).虛擬存儲器的基本思想是程序,數據,堆棧的總的大小能夠超過物理存儲器的大小,操做系統把當前使用的部分保留在內存中,而把其餘未被使用的部分保存在磁盤上。好比對一個16MB的程序和一個內存只有4MB的機器,操做系統經過選擇,能夠決定各個時刻將哪4M的內容保留在內存中,並在須要時在內存和磁盤間交換程序片斷,這樣就能夠把這個16M的程序運行在一個只具備4M內存機器上了。而這個16M的程序在運行前沒必要由程序員進行分割。架構

虛擬內存計算機系統內存管理的一種技術。它使得應用程序認爲它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它一般是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在須要時進行數據交換。目前,大多數操做系統都使用了虛擬內存,如Windows家族的「虛擬內存」;Linux的「交換空間」等。app

虛擬內存別稱 虛擬存儲器(Virtual Memory)。 電腦中所運行的
程序均需經由 內存執行,若執行的程序佔用內存很大或不少,則會致使內存消耗殆盡。爲解決該問題, Windows中運用了虛擬 內存[2]   技術,即勻出一部分硬盤空間來充當內存使用。當內存耗盡時,電腦就會自動調用硬盤來充當內存,以緩解內存的緊張。若計算機運行程序或操做所需的 隨機存儲器( RAM)不足時,則 Windows 會用 虛擬存儲器進行補償。它將計算機的 RAM硬盤上的臨時空間組合。當RAM運行速率緩慢時,它便將數據從RAM移動到稱爲「 分頁文件」的空間中。將數據移入 分頁文件可釋放RAM,以便完成工做。 通常而言,計算機的RAM 容量越大,程序運行得越快。若計算機的速率因爲RAM可用空間匱乏而減緩,則可嘗試經過增長虛擬內存來進行補償。可是,計算機從RAM讀取數據的速率要比從硬盤讀取數據的速率快,於是擴增RAM 容量(可加 內存條)是最佳選擇。
虛擬內存是Windows 爲做爲內存使用的一部分硬盤空間。虛擬內存在硬盤上其實就是爲一個碩大無比的文件,文件名是 PageFile.Sys,一般狀態下是看不到的。必須關閉資源管理器對系統文件的保護功能才能看到這個文件。虛擬內存有時候也被稱爲是「頁面文件」就是從這個文件的文件名中來的。
 
3.地址範圍:任什麼時候候,計算機上都存在一個程序可以產生的地址集合,咱們稱之爲地址範圍。這個範圍的大小由CPU的位數決定,例如一個32位的CPU,它的地址範圍是0~0xFFFFFFFF (4G),而對於一個64位的CPU,它的地址範圍爲0~0xFFFFFFFFFFFFFFFF (16E).這個範圍就是咱們的程序可以產生的地址範圍,咱們把這個地址範圍稱爲虛擬地址空間,該空間中的某一個地址咱們稱之爲虛擬地址。與虛擬地址空間和虛擬地址相對應的則是物理地址空間和物理地址,大多數時候咱們的系統所具有的物理地址空間只是虛擬地址空間的一個子集。這裏舉一個最簡單的例子直觀地說明這二者,對於一臺內存爲256M的32bit x86主機來講,它的虛擬地址空間範圍是0~0xFFFFFFFF(4G),而物理地址空間範圍是0x00000000~0x0FFFFFFF(256M)。
 
4.在沒有使用 虛擬存儲器的機器上, 虛擬地址被直接送到內存總線上,使具備相同地址的物理存儲器被讀寫;而在使 用了虛擬存儲器的狀況下,虛擬地址不是被直接送到內存地址總線上,而是送到存儲器管理單元MMU,把虛擬地址映射爲物理地址。
 
5.分頁機制:大多數使用虛擬存儲器的系統都使用一種稱爲分頁(paging)機制。虛擬地址空間劃分紅稱爲頁(page)的單位,而相應的物理地址空間也被進行劃分,單位是頁幀(frame).頁和頁幀的大小必須相同。在這個例子中咱們有一臺能夠生成32位地址的機器,它的虛擬地址範圍從0~0xFFFFFFFF(4G),而這臺機器只有256M的物理地址,所以他能夠運行4G的程序,但該程序不能一次性調入內存運行。這臺機器必須有一個達到能夠存放4G程序的外部存儲器(例如磁盤或是FLASH),以保證程序片斷在須要時能夠被調用。在這個例子中,頁的大小爲4K,頁幀大小與頁相同——這點是必須保證的,由於內存和外圍存儲器之間的傳輸老是以頁爲單位的。對應4G的虛擬地址和256M的物理存儲器,他們分別包含了1M個頁和64K個頁幀。

 

6.  咱們先根據上圖解釋一下分頁後要用到的幾個術語,在上面咱們已經接觸了頁和頁框,上圖中藍色部分是物理空間,其中每一格表示一個物理頁框。橘黃色部分是虛擬空間,每一格表示一個頁,它由兩部分組成,分別是Frame Index(頁框索引)和位p(present 存在位),Frame Index的意義很明顯,它指出本頁是往哪一個物理頁框進行映射的,位p的意義則是指出本頁的映射是否有效,如上圖,當某個頁並無被映射時(或稱映射無效,Frame Index部分爲X),該位爲0,映射有效則該位爲1。


    咱們執行下面這些指令(本例子的指令不針對任何特定機型,都是僞指令)
例1:
    MOVE REG,0 //將0號地址的值傳遞進寄存器REG.
    虛擬地址0將被送往MMU,MMU看到該虛地址落在頁0範圍內(頁0範圍是0到4095),從上圖咱們看到頁0所對應(映射)的頁框爲2(頁框2的地址範圍是8192到12287),所以MMU將該虛擬地址轉化爲物理地址8192,並把地址8192送到地址總線上。內存對MMU的映射一無所知,它只看到一個對地址8192的讀請求並執行它。MMU從而把0到4096的虛擬地址映射到8192到12287的物理地址。spa


例2:
    MOVE REG,8192
    被轉換爲
    MOVE REG,24576 
    由於虛擬地址8192在頁2中,而頁2被映射到頁框6(物理地址從24576到28671)操作系統


例3:
    MOVE REG,20500
    被轉換爲
    MOVE REG,12308
    虛擬地址20500在虛頁5(虛擬地址範圍是20480到24575)距開頭20個字節處,虛頁5映射到頁框3(頁框3的地址範圍是 12288到16383),因而被映射到物理地址12288+20=12308。3d


      經過適當的設置MMU,能夠把16個虛頁隱射到8個頁框中的任何一個,可是這個方法並無有效的解決虛擬地址空間比物理地址空間大的問題。從上圖中咱們能夠看到,咱們只有8個頁框(物理地址),但咱們有16個頁(虛擬地址),因此咱們只能把16個頁中的8個進行有效的映射。咱們看看例4會發生什麼狀況htm

      MOV REG,32780
      虛擬地址32780落在頁8的範圍內,從上圖總咱們看到頁8沒有被有效的進行映射(該頁被打上X),這是又會發生什麼?MMU注意到這個頁沒有被映射,因而通知CPU發生一個缺頁故障(page fault).這種狀況下操做系統必須處理這個頁故障,它必須從8個物理頁框中找到1個當前不多被使用的頁框並把該頁框的內容寫入外圍存儲器(這個動做被稱爲page copy),隨後把須要引用的頁(例4中是頁8)映射到剛纔釋放的頁框中(這個動做稱爲修改映射關係),而後重新執行產生故障的指令(MOV REG,32780)。假設操做系統決定釋放頁框1,那麼它將把虛頁8裝入物理地址的4-8K,並作兩處修改:首先把標記虛頁1未被映射(原來虛頁1是被影射到頁框1的),以使之後任何對虛擬地址4K到8K的訪問都引發頁故障而使操做系統作出適當的動做(這個動做正是咱們如今在討論的),其次他把虛頁8對應的頁框號由X變爲1,所以從新執行MOV REG,32780時,MMU將把32780映射爲4108。blog

 

 7.索引

個人s3c2410上配置的SDRSAM大小爲64M,該SDRAM的物理地址範圍是0x3000 0000~0x33FF FFFF(屬於Bank 6),因爲1個Section的大小是1M,因此該物理空間能夠被分紅64個物理段(頁框).進程


      在Section模式下,送進MMU的虛擬地址(注1)被分爲兩部分(這點和咱們上面舉的例子是同樣的),這兩部分爲 Descriptor Index(至關於上面例子的Page Index)和 Offset,descript index長度爲12bit(2^12=4096,從這個關係式你能看出什麼?:) ),Offset長度爲20bit(2^20=1M,你又能看出什麼?:)).觀察一下一個描述符(Descriptor)中的Section Base Address部分,它長度爲12 bit,裏面的值是該虛擬段(頁)映射成的物理段(頁框)的物理地址前12bit,因爲每個物理段的長度都是1M,因此物理段首地址的後20bit老是爲0x00000(每一個Section都是以1M對齊),肯定一個物理地址的方法是 物理頁框基地址+虛擬地址中的偏移部分=Section Base Address<<20+Offset ,呵呵,可能你有點糊塗了,仍是舉一個實際例子說明吧。

      假設如今執行指令MOV REG, 0x30000012,虛擬地址的二進制碼爲00110000 00000000 00000000 00010010,前12位是Descriptor Index= 00110000 0000=768,故在Translation Table裏面找到第768號描述符,該描述的Section Base Address="0x0300",也就是說描述符所描述的虛擬段(頁)所映射的物理段(頁框)的首地址爲0x3000 0000(物理段(頁框)的基地址=Section Base Address左移20bit=0x0300<<20=0x3000 0000),而Offset=000000 00000000 00010010=0x12,故虛擬地址0x30000012映射成的物理地址=0x3000 0000+0x12=0x3000 0012(物理頁框基地址+虛擬地址中的偏移)。你可能會問怎麼這個虛擬地址和映射後的物理地址同樣?這是由咱們定義的映射規則所決定的。在這個例子中咱們定義的映射規則是把虛擬地址映射成和他相等的物理地址。咱們這樣書寫映射關係的代碼:
void mem_mapping_linear(void)
{
    unsigned long descriptor_index, section_base, sdram_base, sdram_size;
    sdram_base=0x30000000;
    sdram_size=0x 4000000;
    for (section _base= sdram_base,descriptor_index = section _base>>20;
         section _base < sdram_base+ sdram_size; 
         descriptor_index+=1;section _base +=0x100000)
    {
         *(mmu_tlb_base + (descriptor_index)) = (section _base>>20) | MMU_OTHER_SECDESC;
    }
}


      上面的這段段代碼把虛擬空間0x3000 0000~0x33FF FFFF映射到物理空間0x3000 0000~0x33FF FFFF,因爲虛擬空間與物理空間空間相吻合,因此虛擬地址與他們各自對應的物理地址在值上是一致的。當初始完Translation Table以後,記得要把Translation Table的首地址(第0號描述符的地址)加載進協處理器CP15的Control Register2(2號控制寄存器)中,該控制寄存器的名稱叫作Translation table base (TTB) register。

 

8.以上討論的是descriptor中的Section Base Address以及虛擬地址和物理地址的映射關係,然而MMU還有一個重要的功能,那就是訪問控制機制(Access Permission )。簡單說訪問控制機制就是CPU經過某種方法判斷當前程序對內存的訪問是否合法(是否有權限對該內存進行訪問),若是當前的程序並無權限對即將訪問的內存區域進行操做,則CPU將引起一個異常,s3c2410稱該異常爲Permission fault,x86架構則把這種異常稱之爲通用保護異常(General Protection),什麼狀況會引發Permission fault呢?好比處於User級別的程序要對一個System級別的內存區域進行寫操做,這種操做是越權的,應該引發一個Permission fault,搞過x86架構的朋友應該聽過保護模式(Protection Mode),保護模式就是基於這種思想進行工做的,因而咱們也能夠這麼說:s3c2410的訪問控制機制其實就是一種保護機制。

相關文章
相關標籤/搜索