ARM存儲管理系統(tǒng)MMU
CPU通過地址來訪問內存中的單元,地址有虛擬地址和物理地址之分。如果CPU沒有MMU(Memory Management Unit,內存管理單元),或者有MMU但沒有啟用,CPU在訪問內存時發(fā)出的地址將直接傳送到地址總線上,使具有相同地址的物理存儲器被讀寫。這稱為物理地址(Physical Address,以下簡稱PA),如下圖所示:
本文引用地址:http://www.ex-cimer.com/article/201611/317531.htm圖1.物理地址示意圖
如果CPU啟用了MMU,CPU核發(fā)出的地址將被MMU截獲,從CPU到MMU的地址稱為虛擬地址(Virtual Address,以下簡稱VA),而MMU將這個地址翻譯成真正的物理地址發(fā)送到地址總線上,也就是將虛擬地址映射成物理地址,如下圖所示:
圖2.虛擬地址示意圖
二、虛擬地址映射物理地址原理
頁表是實現虛擬地址到物理地址轉換的一個重要手段。我們在使用MMU以前,需要在內存中新建一個頁表。表中的每一行(即一個字的大?。┐娣诺氖且粋€物理內存頁的基地址,該頁的訪問權限和緩沖特性等,這里將頁表中這樣的一行稱為一個地址變換條目。頁表存放在內存中,CP15的C2寄存器用來存放頁表的基地址。
多數使用虛擬存儲器的系統(tǒng)都使用一種稱為分頁(paging)。虛擬地址空間劃分成稱為頁(page)的單位。而相應的物理地址空間也被進行劃分,單位是頁框(frame).頁和頁框的大小必須相同。
虛擬地址被MMU分為兩部分,,第一部分是頁號索引(page Index),第二部分則是相對該頁首地址的偏移量(offset)
當CPU訪問一個地址時,該地址是虛擬地址,于是該地址被送到MMU,MMU再根據虛擬地址的高幾位作為頁號索引,在頁表中尋找對應的地址變換條目。從地址變換條目中找到物理地址的頁基地址,再加上虛擬地址中的偏移量,便得到了真正的物理地址,然后由MMU將物理地址發(fā)送到地址總線上,訪問物理內存。
那么MMU是如何使用頁號索引在頁表中找到對應的地址變換條目呢?MMU會用CP15協(xié)處理其中的C2寄存器存放的頁表基地址加上虛擬地址的頁號索引值,然后便得到了頁表中對應的地址變換條目的地址。其實頁號索引就是相對于頁表基地址的一個偏移量,然后使用基地址加偏移量的方式得到一個頁表中的地址。
例:如圖所示,如果分頁大小為1M,虛擬地址為0x30000012,
虛擬地址的二進制碼為00110000 00000000 00000000 00010010 前12位為頁號索引,后20位為偏移量,因為2^20 = 1M
前12位頁號索引為00110000 0000 = 768,所以在頁表中找到相對于頁表基地址的偏移量為768的地址,然后得到地址變換條目。于是0x0300 << 20位,便得到了物理頁基地址,再加上虛擬地址中的偏移位0000 00000000 00010010 = 0x12,便得到了真正的物理地址0x30000012。
1、TLB的概念
從虛擬地址到物理地址的變換過程其實就是查詢頁表的過程,由于頁表存放在內存中,這個查詢過程通常代價很大。而程序在執(zhí)行過程中具有局部性,也就是說,一段時間內,對頁表的訪問只是局限在少數幾個單元中。根據這個特點,采用一個容量更小、訪問速度更快的存儲器來存放當前訪問需要的地址變換條目。這個小容量的頁表稱為快表,也稱TLB.
當CPU訪問內存時,現在TLB中查找需要的地址變換條目。如果該條目不存在,CPU從位于內存的頁表中查詢,并把相應的結果添加到TLB中。這樣,當CPU下一次又需要該地址變換條目時,可以從TLB中直接得到,從而使地址變換的速度大大加快。
當內存中的頁表內容改變,或者通過修改CP15中的寄存器C2使用新的頁表時,TLB的內容需要全部清除。MMU提供了相關的硬件支持這種操作。CP15中的寄存器C8用來 控制清除TLB內容的相關操作。
MMU可以將某些地址變換條目鎖定在TLB中,從而使得進行與該地址變換條目相關的地址變換速度保持很快。在MMU中C10用于控制TLB內容的鎖定。
注:TLB中存放的是地址變換條目,相當于一個小頁表。
- 使無效TLB內容
有時候頁表可能只是部分內容改變了,只影響了很少的地址映射關系,這種情況下,可以只使無效TLB對應的單個地址變換條目可能會提高系統(tǒng)性能。
系統(tǒng)協(xié)處理器CP15的寄存器C8就是清除TLB內容的相關操作。它是一個只寫的寄存器。
MCR p15,0,Rd,c8,CRm,opcode_2
Rd中為要寫入C8寄存器的內容,CRm和opcode_2的不同組合決定指令執(zhí)行的不同操作。
指令 | Rd | 含義 |
MCR p15, 0, Rd, c8, c5, 0 | 0 | 使無效整個指令TLB |
MCR p15, 0, Rd, c8, c5, 1 | 虛擬地址 | 使無效指令TLB中的單個地址變換條目 |
MCR p15, 0, Rd, c8, c6, 0 | 0 | 使無效整個數據TLB |
MCR p15, 0, Rd, c8, c6, 1 | 虛擬地址 | 使無效數據TLB中的單個地址變換條目 |
MCR p15, 0, | 0 | 使無效整個數據和指令TLB |
MCR p15, 0, | 虛擬地址 | 使無效數據和指令TLB中的單個地址變換條目 |
- 鎖定TLB的內容
2、存儲訪問過程
a、使能MMU時的存儲訪問過程。
當ARM處理器請求存儲訪問時,首先在TLB中查找虛擬地址。如果系統(tǒng)中數據TLB和指令TLB是分開的,在取指令時,從指令TLB查找相應的虛擬地址,對于其他內存訪問操作,從數據TLB中查找相應的虛擬地址。
如果虛擬地址對應的地址變換條目不在TLB中,CPU從位于內存的頁表中查詢,并把相應的結果添加到TLB中。如果TLB已經滿了,還需要根據一定的淘汰算法進行替換。這樣,當CPU下一次又需要該地址變換條目時,可以從TLB中直接得到,從而使地址變換的速度大大加快。
當得到了需要的地址變化條目以后,將進行以下操作
(3)根據存取權限控制位和域訪問控制位確定該內存訪問是否被允許。如果該內存訪問不被允許,CP15向ARM處理器報告存儲訪問中止。
(4)對于不允許緩存的存儲訪問,使用步驟(1)中得到的物理地址訪問內存。對于允許緩存的存儲訪問,如果在cache命中,則忽略物理地址;如果cache沒有命中,使用步驟(1)中得到的物理地址訪問內存,并把該塊數據讀取到cache中。
- 禁止MMU時,是否支持cache和write buffer由各個具體芯片的設計確定。如果芯片規(guī)定禁止MMU時禁止cache和write buffer,則存儲訪問將不考慮C、B控制位。如果芯片規(guī)定當禁止MMU時可以使能cache和write buffer,則數據訪問時,C=0,B=0;指令讀取時,如果使用分開的TLB則C=1,如果使用統(tǒng)一的TLB則C=0;
- 存儲訪問不進行權限控制,MMU也不會產生存儲訪問中止信號
- 所有的物理地址和虛擬地址相等,即使用平板模式
- 在使能MMU之前,要在內存中建立頁號表,同時CP15中的各相關寄存器必須完成初始化。
- 如果使用的不是平板存儲模式(物理地址和虛擬地址相等),在禁止/使能MMU時,虛擬地址和物理地址的對應關系會發(fā)生改變,這時應該清除cache中的當前地址變換條目
- 如果完成禁止/使能MMU的代碼的物理地址和虛擬地址不相同,則禁止/使能MMU時會造成很大麻煩,因此強烈建議完成禁止/使能 MMU的代碼的物理地址和虛擬地址最好相同
域: 標明了當前段屬于哪個域。Domain與AP配合使用,對訪問權限進行檢查
C: 如下表所示
B: 如下表所示
bits[1:0]:
310 | |||||||||||||||
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
10:保留狀態(tài)(我們最好不要填寫該值,以免引起不能確定的問題)
11:當前級別下,對該內存區(qū)域的訪問都不進行權限檢查。這時AP位無效
b、二級映射
當使用二級映射時,一級頁表L1仍然存在,但是一級頁表中不再存放物理段基地址了,而是存放了二級頁表的基地址,也就是二級頁表的首地址。
一級頁表要表示4G的地址范圍,一共4096項,每一項都表示1M的大小。二級頁表相當于對一級頁表這1M的范圍作更詳細的劃分,所以每個二級頁表要表示1M的地址范圍。
B: 如下表所示
評論