MMU和cache學習

1.      MMU

MMUmemory management unit,稱爲內存管理單元,或者是存儲器管理單元,MMU是硬件設備,它被保存在主存(main memory)的兩級也表控制,並且是由協處理器CP15的寄存器1M位來決定是enabled還是disabledMMU的主要作用是負責從CPU內核發出的虛擬地址到物理地址的映射,並提供硬件機制的內存訪問權限檢查。MMU使得每個用戶進程擁有自己的地址空間(對於WINCE5.0,每個進程是32MB;而對於WINCE6.0,每個進程的獨佔的虛擬空間是2GB),並通過內存訪問權限的檢查保護每個進程所用的內存不被其他進程破壞。

 

下面是MMU提供的功能和及其特徵

 

2.      VAPA

VAvirtual address稱爲虛擬地址,PAphysical address稱爲物理地址。CPU通過地址來訪問內存中的單元,如果CPU沒有MMU,或者有MMU但沒有啓動,那麼CPU內核在取指令或者訪問內存時發出的地址(此時必須是物理地址,假如是虛擬地址,那麼當前的動作無效)將直接傳到CPU芯片的外部地址引腳上,直接被內存芯片(物理內存)接收,這時候的地址就是物理地址。如果CPU啓用了MMU(一般是在bootloader中的eboot階段的進入main()函數的時候啓用)CPU內核發出的地址將被MMU截獲,這時候從CPUMMU的地址稱爲虛擬地址,而MMU將這個VA翻譯成爲PA發到CPU芯片的外部地址引腳上,也就是將VA映射到PA中。MMUVA映射到PA是以頁(page)爲單位的,對於32位的CPU,通常一頁爲4k,物理內存中的一個物理頁面稱頁爲一個頁框(page frame)。虛擬地址空間劃分成稱爲頁(page)的單位,而相應的物理地址空間也被進行劃分,單位是頁框(frame).頁和頁框的大小必須相同。

 

3.      VAPA的映射過程

 

首先將CPU內核發送過來的32VA[31:0]分成三段,前兩段VA[31:20]VA[19:12]作爲兩次查表的索引,第三段VA[11:0]作爲頁內的偏移,查表的步驟如下:

從協處理器CP15的寄存器2(TTB寄存器,translation table base register)中取出保存在其中的第一級頁表(translation table)的基地址,這個基地址指的是PA,也就是說頁表是直接按照這個地址保存在物理內存中的。

 

TTB中的內容爲基地址,以VA[31:20]爲索引值在一級頁表中查找出一項(2^12=4096),這個頁表項(也稱爲一個描述符,descriptor)保存着第二級頁表(coarse page table)的基地址,這同樣是物理地址,也就是說第二級頁表也是直接按這個地址存儲在物理內存中的。

 

VA[19:12]爲索引值在第二級頁表中查出一項(2^8=256),這個表項中就保存着物理頁面的基地址,我們知道虛擬內存管理是以頁爲單位的,一個虛擬內存的頁映射到一個物理內存的頁框,從這裏就可以得到印證,因爲查表是以頁爲單位來查的。

 

有了物理頁面的基地址之後,加上VA[11:0]這個偏移量(2^12=4KB)就可以取出相應地址上的數據了。

 

這個過程稱爲Translation Table WalkWalk這個詞用得非常形象。從TTB走到一級頁表,又走到二級頁表,又走到物理頁面,一次尋址其實是三次訪問物理內存。注意這個“走”的過程完全是硬件做的,每次CPU尋址時MMU就自動完成以上四步,不需要編寫指令指示MMU去做,前提是操作系統要維護頁表項的正確性,每次分配內存時填寫相應的頁表項,每次釋放內存時清除相應的頁表項,在必要的時候分配或釋放整個頁表。

 

4.      CPU訪問內存時的硬件操作順序

 

CPU訪問內存時的硬件操作順序,各步驟在圖中有對應的標號:

1 CPU內核(圖中的ARM)發出VA請求讀數據,TLB(translation lookaside buffer)接收到該地址,那爲什麼是TLB先接收到該地址呢?因爲TLBMMU中的一塊高速緩存(也是一種cache,是CPU內核和物理內存之間的cache),它緩存最近查找過的VA對應的頁表項,如果TLB裏緩存了當前VA的頁表項就不必做translation table walk了,否則就去物理內存中讀出頁表項保存在TLB中,TLB緩存可以減少訪問物理內存的次數。

 

2 頁表項中不僅保存着物理頁面的基地址,還保存着權限和是否允許cache的標誌。MMU首先檢查權限位,如果沒有訪問權限,就引發一個異常給CPU內核。然後檢查是否允許cache,如果允許cache就啓動cacheCPU內核互操作。

 

3 如果不允許cache,那直接發出PA從物理內存中讀取數據到CPU內核。

 

4 如果允許cache,則以VA爲索引到cache中查找是否緩存了要讀取的數據

,如果cache中已經緩存了該數據(稱爲cache hit)則直接返回給CPU內核,如果cache中沒有緩存該數據(稱爲cache miss),則發出PA從物理內存中讀取數據並緩存到cache中,同時返回給CPU內核。但是cache並不是只去CPU內核所需要的數據,而是把相鄰的數據都去上來緩存,這稱爲一個cache lineARM920Tcache line32個字節,例如CPU內核要讀取地址0x30000134~0x30001374個字節數據,cache會把地址0x30000120~0x3000137(對齊到32字節地址邊界)32字節都取上來緩存。

 

5.      ARM920T支持多種尺寸規格的頁表

 

ARM體系結構最多使用兩級頁表來進行轉換,頁表由一個個條目組成,每個條目存儲一段虛擬地址對應的物理地址及訪問權限,或者下一級頁表的地址。S3C2443最多會用到兩級頁表,已段(section,大小爲1M)的方式進行轉換時只用到一級頁表,以頁(page)的方式進行轉換時用到兩級頁表。而頁的大小有3種:大頁(large pages64KB),小頁(small pages4KB)和極小頁(tiny pages1KB)。條目也成爲描述符,有段描述符、大頁描述符、小頁描述符和極小頁描述符,分別保存段、大頁、小頁和極小頁的起始物理地址,見下圖

 

 

MMU的查表過程,首先從CP15的寄存器TTB找到一級頁表的基地址,再把VA[31:20]作爲索引值從表中找出一項,這個表項稱爲一級頁描述符(level one descriptor),一個這樣的表項佔4個字節,那麼一級頁表需要保存的物理內存的大小是4*4096=16KB,表項可以是一下四種格式之一:

 

如果描述符的最低位是00,屬於fault格式,表示該範圍的VA沒有映射到PA

 

如果描述符的最低位是10,屬於section格式,這種格式沒有二級頁表而是直接映射到物理頁面,一個色彩體哦你是1M的大頁面,描述符中的VA[31:20]就是這個頁面的基地址,基地址的VA[19:0]低位全爲0,對齊到1M地址邊界,描述符中的domainAP位控制訪問權限,CB兩位控制緩存。

 

如果描述符的最低兩位是0111,則分別對應兩種不同規格的二級頁表。根據地址對齊的規律想一下,這兩種頁表分別是多大?從一級描述符中取出二級頁表的基地址,再把VA的一部分作爲索引去查二級描述符(level two descriptor),如果是coarse page,則VA[19:12](2^8=256)作爲查找二級頁表表項的索引;如果是fine page,則VA[19:10](2^10=024)。二級描述符可以是下面四種格式之一:

 

 

二級描述符最低兩位是00是屬於fault格式,其它三種情況分別對應三種不同規格的物理頁面,分別是large page(64KB)small page(4KB)tiny page(1KB),其中large pagesmall page4AP權限位,每組兩個bit,這樣可以爲每1/4個物理頁面分別設置不同的權限,也就是說large page可以爲每16KB設置不同的權限,small page可以爲每1KB設置不同的權限。

 

ARM920T提供了多種頁表和頁面規格,但操作系統只採用其中一種,WINCE採用的就是一級描述符是coarse page table格式(也即由VA[19:12]來作爲查找二級頁表項的索引),二級描述符是small page格式(也即是VA[11:0]來作爲查找物理頁面偏移量的索引),每個物理頁面大小是4KB

 

根據上圖我們來分析translation table walk的過程

VA被劃分爲三段用於地址映射過程,各段的長度取決於頁描述符的格式。

 

TTB寄存器中只有[31:14]位有效,低14位全爲0,因此一級頁表的基地址對齊到16K地址邊界,而一級頁表的大小也是16K

 

一級頁表的基地址加上VA[31:20]左移兩位組成一個物理地址。想一想爲什麼VA[31:20]要左移兩位佔據[13:2]的位置,而空出[1:0]兩位呢?應該是需要空出最低兩位用於表示當前要尋找的一級描述符是coarse page格式,目前不清楚,有待了解。

 

用這個組裝的物理地址從物理內存中讀取一級頁表描述符,這是一個coarse page table格式的描述符。

 

通過domain權限檢查後,coarse page table的基地址再加上VA[19:12]左移兩位組裝成一個物理地址。

 

用這個組裝的物理地址從物理內存中讀取二級頁表描述符,這是一個small page格式的描述符。

 

通過AP權限檢查後,small page的基地址再加上VA[11:0]就是最終的物理地址了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章