一、MMU簡(jiǎn)介
MMU是Memory Manage Unit的縮寫(xiě),即存儲(chǔ)管理單元的意思。MMU實(shí)現(xiàn)以下功能:
- 1)虛擬存儲(chǔ)地址到物理存儲(chǔ)地址的映射;
- 2)控制存儲(chǔ)空間訪問(wèn)權(quán)限;
- 3)設(shè)置存儲(chǔ)空間的緩沖特性。
與MMU相關(guān)的一些基本概念介紹如下:
1-頁(yè)表(Translate Table)
頁(yè)表又叫翻譯表,用來(lái)將虛擬地址翻譯成對(duì)應(yīng)的物理地址 , 它位于內(nèi)存中,是實(shí)現(xiàn)MMU功能的重要組成部分 ,處理器通過(guò)查找頁(yè)表中的描述符來(lái)獲取虛擬地址對(duì)應(yīng)的物理地址。
ARM處理器是按兩級(jí)分頁(yè)來(lái)管理內(nèi)存的,所以頁(yè)表包括一級(jí)頁(yè)表和二級(jí)頁(yè)表。
- 一級(jí)頁(yè)表中的每一項(xiàng)(1個(gè)字,4字節(jié))對(duì)應(yīng)于虛擬存儲(chǔ)空間的一段(section),一段的大小為1MB(0x100000字節(jié)),該項(xiàng)包含了該虛擬存儲(chǔ)段對(duì)應(yīng)的物理存儲(chǔ)段的基地址或者一段存儲(chǔ)空間內(nèi)每頁(yè)的二級(jí)頁(yè)表描述符組成的表的基地址、所屬的內(nèi)存域編號(hào)、緩沖特性等, 一級(jí)頁(yè)表的基地址保存在ARM處理器中CP15協(xié)處理器的C2寄存器中 ,該寄存器中保存的是一級(jí)頁(yè)表的物理基地址,而不是虛擬地址。
- 二級(jí)頁(yè)表中的每一項(xiàng)(1word,4bytes)對(duì)應(yīng)于虛擬存儲(chǔ)空間的一頁(yè),一頁(yè)的大小可以是4KB或1KB ,該項(xiàng)包含了該虛擬存儲(chǔ)頁(yè)對(duì)應(yīng)的物理存儲(chǔ)頁(yè)的基地址、該頁(yè)的訪問(wèn)權(quán)限和該頁(yè)的緩沖特性等。我們將頁(yè)表中的每一項(xiàng)叫做一個(gè)地址變換條目(entry),也可以叫一個(gè)頁(yè)表項(xiàng)。
2-翻譯援助緩沖區(qū)(Translation Lookaside Buffer,TLB)
TLB在硬件上和cache一樣 , 是處理器內(nèi)部的一小塊高速SRAM內(nèi)存,用于緩存,與cache不同的是,它專門(mén)緩存存放在內(nèi)存中的頁(yè)表 ,容量相對(duì)比較小, 而cache則用于緩存普通內(nèi)存,容量相對(duì)比較大 。
TLB也分為數(shù)據(jù)TLB和指令TLB, 指令TLB用于取指令時(shí)的指令地址翻譯 , 而數(shù)據(jù)TLB用于其他存儲(chǔ)訪問(wèn)操作時(shí)的地址翻譯 。
有的處理器中數(shù)據(jù)TLB和指令TLB是分開(kāi)的,有的處理器中這兩者是統(tǒng)一的。
TLB是為了提高處理器查詢頁(yè)表的速度而設(shè)計(jì)的,所以TLB又叫快表 。
當(dāng)處理器要查詢頁(yè)表時(shí)首先在TLB中查找,如果要查找的頁(yè)表項(xiàng)不在TLB中,那么CPU從位于內(nèi)存中的頁(yè)表中查詢,并把相應(yīng)的結(jié)果添加到TLB中,這樣CPU下次查找該頁(yè)表項(xiàng)時(shí)就可以從TLB中直接獲取。
二、系統(tǒng)訪問(wèn)存儲(chǔ)空間的過(guò)程
系統(tǒng)訪問(wèn)存儲(chǔ)空間的過(guò)程對(duì)于使能MMU和禁止MMU兩種情況是不一樣的 。 ARM處理器中控制MMU功能的開(kāi)關(guān)位是CP15協(xié)處理器的C1寄存器的bit[0] ,當(dāng)該位為0時(shí)禁止MMU功能,當(dāng)該位為1時(shí)使能MMU功能。
1 使能MMU時(shí)的情況
當(dāng)CPU請(qǐng)求存儲(chǔ)訪問(wèn)時(shí),首先在TLB中查找虛擬地址,如果該虛擬地址對(duì)應(yīng)的地址變換條目(頁(yè)表項(xiàng))不在TLB中,CPU從位于內(nèi)存中的頁(yè)表中查詢對(duì)應(yīng)于該虛擬地址的頁(yè)表項(xiàng),并把相應(yīng)的結(jié)果添加到TLB中,這樣CPU下次再訪問(wèn)該頁(yè)表項(xiàng)時(shí)就可以直接從TLB中獲取。如 果TLB已經(jīng)裝滿,還應(yīng)該根據(jù)一定的淘汰算法進(jìn)行替換 。
在得到了需要的頁(yè)表項(xiàng)后,將進(jìn)行以下操作:
- 1)得到該虛擬地址對(duì)應(yīng)的物理地址;
- 2)根據(jù)頁(yè)表項(xiàng)中的緩沖特性控制位C(Cachable)和B(Bufferable)的值決定是否緩存該存儲(chǔ)訪問(wèn)的結(jié)果;
- 3)根據(jù)存取權(quán)限控制位和所屬存儲(chǔ)域的權(quán)限設(shè)置情況確定該存儲(chǔ)訪問(wèn)是否被允許;
- 4) 對(duì)于不允許緩存(uncached)的存儲(chǔ)訪問(wèn),使用上面步驟1)中得到的物理地址訪問(wèn)存儲(chǔ)空間 。對(duì)于允許緩存(cached)的存儲(chǔ)訪問(wèn),如果cache命中,則忽略物理地址;如果cache沒(méi)有命中,則使用上面步驟1)中得到的物理地址訪問(wèn)存儲(chǔ)空間,并把該數(shù)據(jù)塊讀到cache中。
有些VA所對(duì)應(yīng)的PA并不是物理內(nèi)存中的地址而是設(shè)備寄存器的地址,對(duì)這些寄存器進(jìn)行讀寫(xiě)并不是為了保存數(shù)據(jù),而是對(duì)設(shè)備做特殊操作,這種VA通常是不允許緩存的,因?yàn)槿绻彺媪?,?duì)VA的讀寫(xiě)將只在Cache中起作用,而不會(huì)傳到設(shè)備寄存器對(duì)設(shè)備進(jìn)行操作。
2 禁止MMU時(shí)的情況
如果系統(tǒng)禁止MMU功能,那么CPU的存儲(chǔ)訪問(wèn)規(guī)則如下:
- 1)當(dāng)禁止MMU時(shí), 是否支持cache和Write Buffer由各具體芯片確定 。如果芯片規(guī)定當(dāng)禁止MMU的同時(shí)也禁止cache和Write Buffer,則存儲(chǔ)訪問(wèn)不考慮緩沖特性控制位C和B的設(shè)置情況;如果芯片規(guī)定當(dāng)禁止MMU時(shí)可以使能cache和Write Buffer,
- 則數(shù)據(jù)訪問(wèn)時(shí),C=0,B=0,
- 指令讀取時(shí),如果使用數(shù)據(jù)和指令分開(kāi)的TLB,則C=1,如果使用統(tǒng)一的TLB,則C=0。
- 2)存儲(chǔ)訪問(wèn)不進(jìn)行權(quán)限控制,MMU也不會(huì)產(chǎn)生存儲(chǔ)訪問(wèn)中止信號(hào)。
- 3)所有的物理地址和虛擬地址相同,也就是使用所謂的 平板存儲(chǔ)模式 。
3 使能/禁止MMU時(shí)應(yīng)注意的問(wèn)題
在使能和禁止MMU時(shí)要注意以下幾點(diǎn):
- 1)在使能MMU前,要在內(nèi)存中建立好頁(yè)表,同時(shí)CP15中的各相關(guān)寄存器必須完成初始化。
- 2)如果使用的不是平板存儲(chǔ)模式(物理地址和對(duì)應(yīng)虛擬地址相等),在禁止/使能MMU時(shí),虛擬地址和物理地址的對(duì)應(yīng)關(guān)系會(huì)發(fā)生改變, 此時(shí)應(yīng)該清除cache中的當(dāng)前地址變換條目(TLB) 。(清楚當(dāng)前的,要最新的,避免cache不是最新的,訪問(wèn)映射出錯(cuò)。)
- 3) 如果完成禁止/使能MMU的代碼的物理地址和虛擬地址不同,禁止/使能MMU時(shí)將造成很大麻煩,因此強(qiáng)烈建議完成禁止/使能MMU的代碼的物理地址和虛擬地址相同 (或者與地址無(wú)關(guān))。
三、ARM處理器地址變換過(guò)程
虛擬存儲(chǔ)空間到物理存儲(chǔ)空間的映射是 以內(nèi)存塊為單位進(jìn)行的 ,虛擬存儲(chǔ)空間中的一塊連續(xù)存儲(chǔ)空間被映射成物理存儲(chǔ)空間中同樣大小的一塊連續(xù)存儲(chǔ)空間。
每一個(gè)地址變換條目(頁(yè)表項(xiàng))記錄了一個(gè)虛擬存儲(chǔ)空間的存儲(chǔ)塊的基地址與物理存儲(chǔ)空間相應(yīng)的一個(gè)存儲(chǔ)塊的基地址的對(duì)應(yīng)關(guān)系。
根據(jù)存儲(chǔ)塊大小不同,可以有多種地址變換。
- 1)段(section):大小為1MB的存儲(chǔ)塊。
- 2)大頁(yè)(Large Page):大小為64KB的存儲(chǔ)塊。
- 3)小頁(yè)(Small Page):大小為4KB的存儲(chǔ)塊。
- 4)極小頁(yè)(Tiny Page):大小為1KB的存儲(chǔ)塊。
通過(guò)采用適當(dāng)?shù)脑L問(wèn)控制機(jī)制, 還可以將大頁(yè)分成大小為16KB的子頁(yè),也可將小頁(yè)分成大小為1KB的子頁(yè) ,但極小頁(yè)不能再細(xì)分,只能以1KB大小的整頁(yè)為單位。
ARM處理器采用兩級(jí)頁(yè)表實(shí)現(xiàn)地址映射:
- 1)一級(jí)頁(yè)表中包含以段為單位的地址變換條目或者指向二級(jí)頁(yè)表的指針,一級(jí)頁(yè)表實(shí)現(xiàn)的地址映射粒度較大。
- 2)二級(jí)頁(yè)表中包含以大頁(yè)、小頁(yè)和極小頁(yè)為單位的地址變換條目。
當(dāng)以二級(jí)分頁(yè)管理某段存儲(chǔ)空間時(shí),要同時(shí)設(shè)置一級(jí)頁(yè)表項(xiàng)和二級(jí)頁(yè)表項(xiàng),
- 一個(gè)一級(jí)頁(yè)表項(xiàng)對(duì)應(yīng)一段(1section=1MB)虛擬存儲(chǔ)空間的映射關(guān)系,
- 一個(gè)一級(jí)頁(yè)表項(xiàng)對(duì)應(yīng)一張二級(jí)頁(yè)表,這張二級(jí)頁(yè)表中的所有頁(yè)表項(xiàng)合在一起對(duì)應(yīng)了前面一級(jí)頁(yè)表項(xiàng)所對(duì)應(yīng)的一段虛擬存儲(chǔ)空間的映射關(guān)系。
ARM處理器的二級(jí)頁(yè)表分為粗粒度二級(jí)頁(yè)表和細(xì)粒度二級(jí)頁(yè)表,
- 一張粗粒度二級(jí)頁(yè)表的最大容量為1KB,
- 一張細(xì)粒度二級(jí)頁(yè)表的最大容量為4KB,
不管是粗粒度還是細(xì)粒度頁(yè)表,每張頁(yè)表都對(duì)應(yīng)一段虛擬存儲(chǔ)空間的映射關(guān)系。
所以粗粒度二級(jí)頁(yè)表的頁(yè)表項(xiàng)(頁(yè)描述符)最小只能描述4KB大?。ㄐ№?yè))虛擬存儲(chǔ)空間的映射關(guān)系,如果再小就沒(méi)有足夠的頁(yè)表空間來(lái)存放一段虛擬存儲(chǔ)空間的全部頁(yè)表項(xiàng)(因?yàn)榇至6榷?jí)頁(yè)表的最大容量為1KB),
而細(xì)粒度二級(jí)頁(yè)表的頁(yè)描述符最小可以描述1KB大?。O小頁(yè))的虛擬存儲(chǔ)空間的映射關(guān)系。
綜上所述,我們可以歸納出以下6種ARM處理器的地址變換方法:
- 1)分段地址變換,這種變換只需要一級(jí)地址變換,而下面5種都需要兩級(jí)地址變換;
- 2)粗粒度大頁(yè)地址變換;
- 3)粗粒度小頁(yè)地址變換(Linux通常使用的地址變換方法);
- 4)細(xì)粒度大頁(yè)地址變換;
- 5)細(xì)粒度小頁(yè)地址變換;
- 6)細(xì)粒度極小頁(yè)地址變換。
在講解以上各種地址變換方法之前我們先介紹一下一級(jí)映射描述符和二級(jí)映射描述符的定義。
1 MMU的一級(jí)映射描述符
ARM處理器MMU的一級(jí)映射描述符編碼格式如下所示:
一級(jí)描述符對(duì)應(yīng)的存儲(chǔ)空間的cache和write buffer特性控制位
2 MMU的二級(jí)映射描述符
ARM處理器MMU的二級(jí)映射描述符編碼格式如下所示:
二級(jí)描述符對(duì)應(yīng)的存儲(chǔ)空間的cache和write buffer特性控制位
3 基于段的地址變換過(guò)程
4 粗粒度大頁(yè)地址變換過(guò)程
5 粗粒度小頁(yè)地址變換過(guò)程
6 細(xì)粒度大頁(yè)地址變換過(guò)程
7 細(xì)粒度小頁(yè)地址變換過(guò)程
8 細(xì)粒度極小頁(yè)地址變換過(guò)程
四、ARM存儲(chǔ)空間訪問(wèn)權(quán)限控制
在ARM處理器中,MMU將整個(gè)存儲(chǔ)空間分成最多16個(gè)域,記作D0~D15,每個(gè)域?qū)?yīng)一定的存儲(chǔ)區(qū)域,該區(qū)域具有相同的訪問(wèn)控制屬性。
在ARM處理器中,MMU中的每個(gè)域的訪問(wèn)權(quán)限分別由CP15的C3寄存器中的兩位來(lái)設(shè)定,C3寄存器剛好可以設(shè)置16個(gè)域的訪問(wèn)權(quán)限。C3寄存器的域定義如表4-6所示。
表4-6 CP15的C3寄存器的域定義
C3寄存器的D0D15各占兩位,它們分別控制D0D15共16域的訪問(wèn)類型,具體說(shuō)明如表4-7所示。
域的訪問(wèn)控制字段編碼及含義
當(dāng)域訪問(wèn)權(quán)限控制位設(shè)置為上面的0b01即客戶類型權(quán)限時(shí),用戶模式以及特權(quán)模式的訪問(wèn)權(quán)限則由CP15的C1控制寄存器中的R和S位以及 頁(yè)表中地址變換條目中的訪問(wèn)權(quán)限控制位AP兩位來(lái)確定 ,具體說(shuō)明如表4-8所示。
MMU中存儲(chǔ)訪問(wèn)權(quán)限控制
五、TLB操作
對(duì)TLB的操作是通過(guò)訪問(wèn) CP15的C8和C10寄存器來(lái)完成的 ,寫(xiě)CP15的C8/C10寄存器的指令格式如下所示:
mcr p15, 0, < rd >, < c8 >, crm, < opcode_2 > mcr p15, 0, < rd >, < c10 >, crm, < opcode_2 >
1 使TLB內(nèi)容無(wú)效
使TLB中的內(nèi)容無(wú)效是通過(guò)寫(xiě)CP15的寄存器C8來(lái)實(shí)現(xiàn)的,指令如表4-9所示。
2 鎖定TLB內(nèi)容
鎖定TLB是通過(guò)寫(xiě)CP15的寄存器C10來(lái)實(shí)現(xiàn)的。鎖定TLB中N條地址變換條目的操作步驟說(shuō)明如下:
- 1)確保在整個(gè)鎖定過(guò)程中不會(huì)產(chǎn)生異常中斷,可以通過(guò)禁止中斷等方法實(shí)現(xiàn);
- 2)如果鎖定的是指令TLB或者統(tǒng)一的TLB,將base=N、victim=N、P=0寫(xiě)入C10;
- 3)使整個(gè)將要鎖定的TLB無(wú)效;
- 4)如果想要鎖定的是指令TLB,確保與鎖定過(guò)程所涉及的指令相關(guān)的地址變換條目已經(jīng)加載到指令TLB中;如果想要鎖定的是數(shù)據(jù)TLB,確保與鎖定過(guò)程所涉及的數(shù)據(jù)相關(guān)的地址變換條目已經(jīng)加載到指令TLB中;如果系統(tǒng)使用的是統(tǒng)一的數(shù)據(jù)TLB和指令TLB,上述兩條都要保證;
- 5)對(duì)于I=0到N-1,重復(fù)執(zhí)行下面操作:將base=i、victim=i、P=1寫(xiě)入寄存器C10,將每一條想要鎖定到快表中的地址變換條目讀取到快表中。對(duì)于數(shù)據(jù)TLB和統(tǒng)一TLB可以使用ldr指令讀取一個(gè)涉及該地址變換條目的數(shù)據(jù),將該地址變換條目讀取到TLB中。對(duì)于指令TLB,通過(guò)操作寄存器C7,將相應(yīng)的地址變換條目讀取到指令TLB中;
- 6)將base=N、victim=N、P=0寫(xiě)入寄存器C10。
3 解除TLB中被鎖定的地址變換條目
解除TLB中被鎖定的地址變換條目,可以使用以下操作步驟:
- 1)通過(guò)操作寄存器C8,使無(wú)效TLB中被鎖定的地址變換條目;
- 2)將base=0、victim=0、P=0寫(xiě)入C10寄存器。
六、存儲(chǔ)訪問(wèn)失效
ARM處理器通過(guò)以下兩種機(jī)制來(lái)檢測(cè)存儲(chǔ)訪問(wèn)失效,進(jìn)而中止CPU的運(yùn)行:
- 1) MMU硬件模塊檢測(cè)與內(nèi)存管理相關(guān)的存儲(chǔ)訪問(wèn)失效 ,一旦 MMU檢測(cè)到存儲(chǔ)訪問(wèn)失效 ,它向CPU發(fā)出通知,并將存儲(chǔ)訪問(wèn)失效的相關(guān)信息保存到寄存器中, 具體說(shuō)就是將失效狀態(tài)保存在CP15的C5寄存器中,將導(dǎo)致失效的地址保存在CP15的C6寄存器中 ,詳見(jiàn)前面CP15的C5、C6寄存器說(shuō)明。這種存儲(chǔ)訪問(wèn)失效叫做MMU失效(MMU Fault)。
- 2)外部存儲(chǔ)系統(tǒng)向CPU報(bào)告存儲(chǔ)訪問(wèn)失效,這種機(jī)制叫做外部存儲(chǔ)訪問(wèn)中止(External Abort)。
1 MMU失效(MMU Fault)
- 1)地址對(duì)齊失效:地址對(duì)齊失效只會(huì)發(fā)生在數(shù)據(jù)訪問(wèn)周期,比如
- 訪問(wèn)字單元(4字節(jié))時(shí)地址的bit[1:0]不全是0或者訪問(wèn)半字(雙字節(jié))單元時(shí)地址的bit[0]不等于0;
- 訪問(wèn)字節(jié)單元不會(huì)產(chǎn)生地址對(duì)齊失效,指令預(yù)取周期也不會(huì)產(chǎn)生地址對(duì)齊失效。
- 2)地址變換失效:
- 當(dāng)一級(jí)地址變換條目的bit[1:0]為0b00時(shí),表示產(chǎn)生了基于段的地址變換失效;
- 當(dāng)二級(jí)地址變換條目的bit[1:0]為0b00時(shí),表示產(chǎn)生了基于頁(yè)的地址變換失效。
- 3)域控制失效:如果所訪問(wèn)的存儲(chǔ)地址對(duì)應(yīng)的一級(jí)地址變換條目中bit[8:5]的值所指的存儲(chǔ)域的兩位控制位被設(shè)置為0,就說(shuō)明產(chǎn)生了域控制失效,域控制失效可能是基于段的也可能是基于頁(yè)的。
- 4)訪問(wèn)權(quán)限控制失效:如果出現(xiàn)了訪問(wèn)權(quán)限沖突就產(chǎn)生訪問(wèn)權(quán)限控制失效。
以上4大類存儲(chǔ)訪問(wèn)失效又可細(xì)分為15種類型, 見(jiàn)前面CP15的C5寄存器說(shuō)明 。
當(dāng)發(fā)生存儲(chǔ)訪問(wèn)失效時(shí),存儲(chǔ)系統(tǒng)可以中止3種存儲(chǔ)訪問(wèn):
- cache內(nèi)容預(yù)取、
- 非緩沖的存儲(chǔ)器訪問(wèn)
- 頁(yè)表訪問(wèn)。
2 外部存儲(chǔ)訪問(wèn)失效(External Abort)
由外部存儲(chǔ)系統(tǒng)向CPU報(bào)告存儲(chǔ)訪問(wèn)失效。
外部存儲(chǔ)訪問(wèn)失效通過(guò) 一個(gè)外部存儲(chǔ)訪問(wèn)失效引腳實(shí)現(xiàn) ,下面的存儲(chǔ)訪問(wèn)操作可以通過(guò)這種機(jī)制中止和重啟動(dòng):
- 1)讀操作;
- 2)非緩沖的寫(xiě)操作;
- 3)一級(jí)描述符的獲?。?/li>
- 4)二級(jí)描述符的獲??;
- 5)非緩沖的存儲(chǔ)區(qū)域中的信號(hào)量操作。
注意:在系統(tǒng)中標(biāo)記為可外部終止的存儲(chǔ)區(qū)域不要進(jìn)行可緩存的寫(xiě)操作。
評(píng)論