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