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