1. 程式人生 > >記憶體管理單元MMU概述

記憶體管理單元MMU概述

記憶體管理單元(Memory Management Unit)簡稱MMU
功能: ①負責虛擬地址到實體地址的對映 ②提供硬體機制的記憶體訪問許可權檢查。
Q:記憶體訪問許可權檢查什麼意思?
A:舉個例子,比如在我們Windows系統的PC中,在一個時間段需要依次執行A,B,C三個應用程式,這三個程式在我們的記憶體地址中都有其相對應的地址空間。當我們在執行A程式出現錯誤或者有可能會破壞B程式時,這時由於記憶體訪問許可權的存在就使得A程式無法訪問B程式所在的記憶體地址空間,從而避免了由於一個程式的錯誤而導致損壞其它記憶體空間的程式,這就是記憶體訪問許可權的作用。

這裡我們具體看MMU的第一個功能:地址對映。
S3C2440中相關的結構分佈如下圖:



假設CPU要讀/寫外部儲存器SDRAM中的某一記憶體地址的資料,這時候有兩條路可以選擇:
1.④⑤
2.①②③

如果選擇第一條路:
CPU發出的地址就可以理解為實體地址,然後經過儲存管理器確定SDRAM中相應的行與列最後讀取具體的資料。
如果選擇第二條路:
CPU發出的地址就可以理解為虛擬地址,經過MMU後出來的就可以認為是實體地址,然後經過儲存管理器確定SDRAM中相應的行與列最後讀取具體的資料。這裡MMU的作用就是把虛擬地址對映為實體地址。

總結:CPU本身不關心地址是實體地址或是虛擬地址,它只管發出這個地址,然後最後讀取資料。不關注這個過程具體怎麼完成的,平時我們寫程式時的連結地址,在CPU這裡並不去區分什麼實體地址還是虛擬地址,在它看來不管是什麼都只是一個地址而已。


虛擬地址(VA,Virtual Address)到實體地址(PA,Physical Address)的轉換過程:
這裡我們只是簡單說一下,不需要太深究,因為這些都是由MMU中硬體完成的,如果想具體的瞭解可以參考韋東山老師寫的《嵌入式Linux應用開發完全手冊》。

VA到PA一般有兩種方法:1.用一個確定的數學公式進行轉換。  2.用表格儲存虛擬地址對應的實體地址。這類表格稱為頁表(Page table),頁表由一個個條目(Entry)組成,每個條目儲存了一段虛擬地址對應的實體地址及其訪問許可權,或者是下一級頁表的地址。

mips使用的是第一種方法:  VA=f(PA)=0xA0000000+PA,也就是PA=0xA0000000-VA。

我們學的ARM CPU用的是第二種方法,S3C2410/S3C2440最多會用到兩級頁表:
①如果以段(Section,1MB)的方式進行轉換時只用到一級頁表;
②以頁(Page)的方式進行轉換時用到兩級頁表。這裡的頁的大小有3種:大頁(64KB),小頁(4KB),極小頁(1KB)。條目也稱為“描述符(Descriptor)”,它有:段描述符、大頁描述符、小頁描述符、極小頁描述符,它們儲存著段、大頁、小頁、極小頁的起始實體地址;粗頁表描述符、細頁表描述符,它們儲存二級頁表的實體地址。

具體轉換過程:
1. 根據給定的虛擬地址找到一級頁表中的條目。
2. 如果此條目是段描述符,則返回實體地址,轉換結束,否則跳到3。
3. 如果此條目是二級頁表描述符,繼續利用虛擬地址在此二級頁表中找到下一個條目。
4. 如果第二個條目是頁描述符,則返回實體地址,轉換結束。
5. 其它情況出錯。

舉個例子:我們用段的方式進行轉換,由於ARM CPU是32位的,所以最大定址範圍為2^32=4GB,也就是虛擬地址表示的範圍為0~4096MB,一個段為1MB,所以我們用的表格就是4096個1MB的段組成的,然後一個段儲存著相應的起始實體地址。

這裡描述通過一級頁表形式的轉換過程圖:


“TTB Base”代表一級頁表的地址。它的值儲存在協處理器CP15的暫存器C2(稱為頁表基址暫存器)。

 

一個段描述符為4個位元組(32bit),那麼4096個段佔4096*4B=16KB,所以當虛擬地址定址範圍為0~4G時,一個一級頁表的大小就為16KB。

由上可知一級頁表的地址必須是16KB對齊的,所以[14:0]都是0。0b100 0000 0000 0000=0x4000=16384=16*1024B=16KB。


上圖為一級頁表的描述符格式,低兩位0b10時表示為段描述符。由於這裡我們直說關於段描述符的相關概念(也就是上圖中第三個格式),所以其它的就不說了,具體瞭解自己可以看書。

[31:21]: 稱為段基址(Section base address)。這個描述符低20位填充0後就是一塊1MB實體地址空間的起始地址。0b1 0000 0000 0000 0000 0000=0x10000=1048576=1024*1024B=1MB。

綜上:以段的方式進行對映時,虛擬地址MVA到實體地址PA的轉換過程如下:


1. 虛擬地址MVA。MVA[31:20]表示一級頁表索引,MVA[19:0]表示段內地址索引。

2. 頁表基地址暫存器。

3. 頁表基址暫存器[31:14]和MVA[31:20]組成一個低2位為0的32位地址,MMU利用這個地址找到段描述符。

4. 一級頁表中的一個32bit段描述符。

5. 段描述符的位[31:20]和MVA[19:0]構成虛擬地址MVA對應的實體地址PA。