構(gòu)與編程(篇五):ARM存儲(chǔ)系統(tǒng)之CP15和MMU)
文章目錄前言一、 ARM中用于存儲(chǔ)管理的控制協(xié)處理器CP151、 訪問(wèn)CP15寄存器的指令2、 CP15的寄存器二、 存儲(chǔ)器管理單元MMU1、 MMU的由來(lái)2、 禁止/使能MMU3、 MMU中地址變換過(guò)程前言本文是學(xué)習(xí)《ARM體系結(jié)構(gòu)與編程》杜春雷 著的讀書(shū)筆記。該書(shū)以 ARM v6 之前的體系架構(gòu)為基礎(chǔ)內(nèi)容相對(duì)較早但對(duì)初學(xué)者仍有不少可借鑒之處。文中結(jié)合了書(shū)中的講解與網(wǎng)絡(luò)資料整理成筆記希望能與大家共同進(jìn)步。一、 ARM中用于存儲(chǔ)管理的控制協(xié)處理器CP151、 訪問(wèn)CP15寄存器的指令指令與語(yǔ)法格式指令說(shuō)明語(yǔ)法格式MCR將ARM寄存器中的數(shù)據(jù)傳送到協(xié)處理器寄存器中MCR{cond} p15, opcode_1, Rd, CRn, CRm, {opcode_2}MRC將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM寄存器中MRC{cond} p15, opcode_1, Rd, CRn, CRm, {opcode_2}注這兩條指令只能在系統(tǒng)模式下使用否則會(huì)觸發(fā)未定義指令異常。在用戶模式下可以由操作系統(tǒng)定義一些 SWI 調(diào)用通過(guò) SWI 調(diào)用間接完成相應(yīng)功能。指令編碼格式及說(shuō)明31~2827~2423~212019~1615~1211~87~543~0cond11100 0 0 (opcode_1)0(MCR) 1(MRC)CRnRdcp_numopcode_21CRm說(shuō)明cond指令執(zhí)行的條件碼。忽略條件碼時(shí)指令無(wú)條件執(zhí)行。opcode_1協(xié)處理器行為操作碼。對(duì)于 CP15 來(lái)說(shuō)opcode_1 永遠(yuǎn)為 0b000否則結(jié)果未知。Rd不能是 R15/PC否則結(jié)果未知。CRn作為目標(biāo)寄存器的協(xié)處理器寄存器編號(hào)為 C0~C15。CRm附加的目標(biāo)寄存器或源操作數(shù)寄存器。如果不需要設(shè)置附加信息應(yīng)將 CRm 設(shè)置為 C0否則結(jié)果未知。opcode_2提供附加信息例如寄存器的版本號(hào)或訪問(wèn)類型用于區(qū)分同一編號(hào)下的不同物理寄存器。可以省略 opcode_2或?qū)⑵湓O(shè)置為 0否則結(jié)果未知。2、 CP15的寄存器CP15可以有16個(gè)32位的寄存器寄存器編號(hào)基本作用在MMU中的作用在PU中的作用0ID編碼只讀ID編碼和cache類型1控制位可讀寫(xiě)各種控制位2存儲(chǔ)保護(hù)和控制地址轉(zhuǎn)換表基地址Cachability的控制位3存儲(chǔ)保護(hù)和控制域訪問(wèn)控制位Bufferablity控制位4存儲(chǔ)保護(hù)和控制保留保留5存儲(chǔ)保護(hù)和控制內(nèi)存失效狀態(tài)訪問(wèn)權(quán)限控制位6存儲(chǔ)保護(hù)和控制內(nèi)存失效地址保護(hù)區(qū)域控制7高速緩存和寫(xiě)緩存高速緩存和寫(xiě)緩存控制8存儲(chǔ)保護(hù)和控制TLB控制保留9高速緩存和寫(xiě)緩存高速緩存鎖定10存儲(chǔ)保護(hù)和控制TLB鎖定保留11保留12保留13進(jìn)程標(biāo)識(shí)符進(jìn)程標(biāo)識(shí)符14保留15因不同設(shè)計(jì)而異因不同設(shè)計(jì)而異因不同設(shè)計(jì)而異注高亮的標(biāo)識(shí)的寄存器為與MMU操作相關(guān)的。寄存器C0當(dāng)操作碼opcode_2 0C0為存放ARM處理器信息ARM7之后的處理器其主標(biāo)識(shí)符的編碼格式31~2423~2019~1615~43~0廠商決定產(chǎn)品子編號(hào)ARM體系版本號(hào)產(chǎn)品主編號(hào)處理器版本號(hào)當(dāng)opcode_2 1C0存放Cache屬性信息31~2928~252423~1211~0000屬性指令和數(shù)據(jù)Cache是否分開(kāi)數(shù)據(jù)Cache相關(guān)屬性指令Cache相關(guān)屬性[23 : 12]用于定義數(shù)據(jù)cache的屬性[11 : 0]用于定義指令cache的屬性11~98~65~321~0000容量Cache相聯(lián)特性M塊大小控制寄存器C1功能主要包括禁止/使能MMU以及其他的與存儲(chǔ)系統(tǒng)相關(guān)的功能配置存儲(chǔ)系統(tǒng)以及ARM處理器中的相關(guān)部分的工作方式。指令格式如下所示MRC p15,0, R0, C1, C0{,0}將CP15的寄存器C1的值讀到R0中 MCR p15,0, R0, C1, C0{,0}將R0的值寫(xiě)到CP15的寄存器C1中寄存器C1的編碼格式及含義31~161514131211109876543210SBZP/UNPL4RRVIZFRSBLDPWCAM控制位含義M0禁止MMU或者PU1使能MMU或者PUA0禁止地址對(duì)齊檢查1使能地址對(duì)齊檢查C0禁止數(shù)據(jù)/整個(gè)cache1使能數(shù)據(jù)/整個(gè)cacheW0禁止寫(xiě)緩沖1使能寫(xiě)緩沖P0異常中斷處理程序進(jìn)入32位地址模式1異常中斷處理程序進(jìn)入26位地址模式D0禁止26位地址異常檢查1使能26位地址異常檢查L(zhǎng)0選擇早期中止模型1選擇后期中止模型B0little endian1big endianS在基于MMU的存儲(chǔ)系統(tǒng)中本位用作系統(tǒng)保護(hù)R在基于MMU的存儲(chǔ)系統(tǒng)中本位用作ROM保護(hù)F0由生產(chǎn)商定義Z0禁止跳轉(zhuǎn)預(yù)測(cè)功能1使能跳轉(zhuǎn)預(yù)測(cè)指令I(lǐng)0禁止指令cache1使能指令cacheV0選擇低端異常中斷向量0x00x1c1選擇高端異常中斷向量0xffff00000xffff001cRR0常規(guī)的cache淘汰算法如隨機(jī)淘汰1預(yù)測(cè)性淘汰算法如round-robin淘汰算法L40保持ARMv5以上版本的正常功能1將ARMv5以上版本與以前版本處理器兼容不根據(jù)跳轉(zhuǎn)地址的bit[0]進(jìn)行ARM指令和Thumb狀態(tài)切換bit[0]等于0表示ARM指令等于1表示Thumb指令[31:16]保留應(yīng)為SBZP/UNP二、 存儲(chǔ)器管理單元MMU在ARM系統(tǒng)中MMU主要完成以下工作虛擬存儲(chǔ)空間到物理存儲(chǔ)空間的映射。存儲(chǔ)器訪問(wèn)權(quán)限的控制。設(shè)置虛擬存儲(chǔ)空間的緩沖的特性。MMU 的實(shí)現(xiàn)需要引入頁(yè)表translate table機(jī)制。頁(yè)表存儲(chǔ)在內(nèi)存中表中的每一行對(duì)應(yīng)虛擬存儲(chǔ)空間的一個(gè)頁(yè)這樣的一行稱為地址變換條目。系統(tǒng)通常提供一個(gè)寄存器來(lái)保存頁(yè)表的基地址在 ARM 中由系統(tǒng)控制協(xié)處理器 CP15 的C2 寄存器保存頁(yè)表基地址。從虛擬地址到物理地址的變換過(guò)程本質(zhì)上就是查詢頁(yè)表的過(guò)程。為了解決內(nèi)存訪問(wèn)速度的問(wèn)題MMU 采用了類似 cache 的方式引入快表 TLBtranslation lookaside buffer機(jī)制用一小塊快速的存儲(chǔ)空間通常為 8~16 個(gè)字來(lái)存放當(dāng)前需要訪問(wèn)的地址變換條目。-C8寄存器用來(lái)控制清除TLB內(nèi)容的相關(guān)操作當(dāng)內(nèi)存中頁(yè)表內(nèi)容改變或者通過(guò)修改CP15的C2寄存器使用新的葉表時(shí)TLB中的內(nèi)容需要全部清除。C10寄存器控制TLB內(nèi)容的鎖定MMU可以將某些地址變換條目鎖定locked down在TLB中從而使得進(jìn)行與該地址變換條目相關(guān)的地址變換速度保持很快。C3寄存器控制與域相關(guān)的屬性的配置MMU可以將整個(gè)存儲(chǔ)空間分為最多16個(gè)域domain。C5和C6寄存器分別處理內(nèi)存失效時(shí)的狀態(tài)指示和失效的地址。注我們?cè)诔绦蛑惺褂玫淖兞亢秃瘮?shù)都有各自的地址在程序被編譯后這些地址就成了指令中的地址指令中的地址就成了CPU執(zhí)行單元發(fā)出的內(nèi)存地址所以在啟用MMU的情況下 程序中使用的地址均是虛擬內(nèi)存地址都會(huì)引發(fā)MMU進(jìn)行查表和地址轉(zhuǎn)換操作。內(nèi)存保護(hù)機(jī)制處理器一般有用戶模式User Mode和特權(quán)模式privileged Mode之分。操作系統(tǒng)可以在頁(yè)表中設(shè)置每個(gè)頁(yè)表訪問(wèn)權(quán)限有些頁(yè)表不可以訪問(wèn)有些頁(yè)表只能在特權(quán)模式下訪問(wèn)有些頁(yè)表在用戶模式和特權(quán)模式下都可以訪問(wèn)同時(shí)訪問(wèn)權(quán)限又分為可讀、可寫(xiě)和可執(zhí)行三種。這樣設(shè)定之后當(dāng)CPU要訪問(wèn)一個(gè)VAVirtual Address時(shí)MMU會(huì)檢查CPU當(dāng)前處于用戶模式還是特權(quán)模式訪問(wèn)內(nèi)存的目的是讀數(shù)據(jù)、寫(xiě)數(shù)據(jù)還是取指令執(zhí)行如果與操作系統(tǒng)設(shè)定的權(quán)限相符則允許訪問(wèn)把VA轉(zhuǎn)換成PA否則不允許執(zhí)行產(chǎn)生異常Exception。段錯(cuò)誤是這樣產(chǎn)生的用戶程序要訪問(wèn)的一個(gè)VA經(jīng)MMU檢查無(wú)權(quán)訪問(wèn)。MMU產(chǎn)生一個(gè)異常CPU從用戶模式切換到特權(quán)模式跳轉(zhuǎn)到內(nèi)核代碼中執(zhí)行異常服務(wù)程序。內(nèi)核把這個(gè)異常解釋為段錯(cuò)誤把引發(fā)異常的進(jìn)程終止掉。1、 MMU的由來(lái)以相對(duì)有限的內(nèi)存空間運(yùn)行遠(yuǎn)大于空間的程序代碼在許多年以前人們還在使用 DOS 或一些古老的操作系統(tǒng)那時(shí)內(nèi)存很小應(yīng)用程序也很小把程序全部裝入內(nèi)存基本就能滿足需要。隨著科技的發(fā)展圖形界面以及其他更復(fù)雜的應(yīng)用不斷出現(xiàn)內(nèi)存已經(jīng)無(wú)法容納這些應(yīng)用程序了。通常的解決辦法是把程序分割成多個(gè)覆蓋塊覆蓋塊 0 最先運(yùn)行運(yùn)行結(jié)束后再調(diào)用另一個(gè)覆蓋塊。雖然這些操作由操作系統(tǒng)完成但需要程序員自己分割程序效率非常低。于是人們提出了虛擬存儲(chǔ)器virtual memory的方法。虛擬存儲(chǔ)器的基本思想是程序、數(shù)據(jù)和堆棧的總大小可以超過(guò)內(nèi)存空間的大小操作系統(tǒng)只把當(dāng)前正在運(yùn)行的部分保存在內(nèi)存中未使用的部分保存在磁盤上。例如一個(gè) 16MB 的程序運(yùn)行在只有 4MB 內(nèi)存的機(jī)器上操作系統(tǒng)可以決定哪 4MB 內(nèi)容留在內(nèi)存中并在需要時(shí)在內(nèi)存與磁盤之間交換程序代碼這樣16MB 的代碼就可以運(yùn)行在 4MB 的機(jī)器中了。注意這里已經(jīng)包含了虛擬地址和物理地址的概念。2、 禁止/使能MMUCP15的寄存器C1的位[0]控制禁止/使能MMU。0禁止1使能。禁止/使能MMU時(shí)應(yīng)注意的問(wèn)題使能MMU之前要在內(nèi)存中建立好頁(yè)表同時(shí)CP15中的各相關(guān)寄存器必須完成初始化。如果使用的不是平板存儲(chǔ)模式在禁止/使能MMU時(shí)虛擬地址和物理地址的對(duì)應(yīng)關(guān)系會(huì)發(fā)生改變這時(shí)應(yīng)該清除cache中的當(dāng)前地址變換條目。如果完成禁止/使能MMU的代碼的物理地址和虛擬地址不相同則禁止/使能MMU時(shí)將造成很大麻煩因此完成禁止/使能MMU的代碼的物理地址和虛擬地址最好相同。3、 MMU中地址變換過(guò)程ARM支持的存儲(chǔ)塊大小段大小為1M的存儲(chǔ)塊大頁(yè)大小為64KB的存儲(chǔ)塊小頁(yè)大小為4KB的存儲(chǔ)塊極小頁(yè)大小為1KB的存儲(chǔ)塊在MMU中采用下面兩級(jí)頁(yè)表實(shí)現(xiàn)一級(jí)頁(yè)表中包含有以段為單位的地址變換條目以及指向二級(jí)頁(yè)表的指針。一級(jí)頁(yè)表實(shí)現(xiàn)的地址映射粒度較大。二級(jí)頁(yè)表中包含以大頁(yè)和小頁(yè)為單位的地址變換條目。其中一種類型的二級(jí)頁(yè)表好包含有以極小頁(yè)為單位的地址變換條目通常以段為單位的地址變換過(guò)程只需要一級(jí)頁(yè)表。而以頁(yè)為單位的地址變換過(guò)程還需要二級(jí)頁(yè)表?;诙蔚牡刂纷儞Q過(guò)程大頁(yè)地址變換過(guò)程粗粒度小頁(yè)地址變換過(guò)程粗粒度極小頁(yè)地址變換過(guò)程細(xì)粒度選擇頁(yè)表大小的優(yōu)點(diǎn)較小的頁(yè)沒(méi)有外碎片內(nèi)部碎片少且每個(gè)頁(yè)碎片不超過(guò)頁(yè)的大小空間利用率高。較大的頁(yè)或段頁(yè)表規(guī)模小頁(yè)表占用內(nèi)存較小。單個(gè)頁(yè)面覆蓋范圍較大TLB命中率高。