一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

內(nèi)存管理單元(MMU)介紹 協(xié)處理器寄存器的操作

 筆錄收藏 2012-08-16
http://www./Linux/2011-09/43525.htm
嵌入式系統(tǒng)中,存儲系統(tǒng)差別很大,可包含多種類型的存儲器件,如 FLASH , SRAM , SDRAM , ROM 等,這些不同類型的存儲器件速度和寬度等各不相同;在訪問存儲單元時(shí),可能采取平板式的地址映射機(jī)制對其操作,或需要使用虛擬地址對其進(jìn)行讀寫;系統(tǒng)中,需引入存儲保護(hù)機(jī)制,增強(qiáng)系統(tǒng)的安全性。為適應(yīng)如此復(fù)雜的存儲體系要求, ARM 處理器中引入了存儲管理單元來管理存儲系統(tǒng)。 

一   內(nèi)存管理單元( MMU )概述 
在 ARM 存儲系統(tǒng)中,使用 MMU 實(shí)現(xiàn)虛擬地址到實(shí)際物理地址的映射。為何要實(shí)現(xiàn)這種映射?首先就要從一個嵌入式系統(tǒng)的基本構(gòu)成和運(yùn)行方式著手。系統(tǒng)上電時(shí),處理器的程序指針從 0x0 (或者是由 0Xffff_0000 處高端啟動)處啟動,順序執(zhí)行程序,在程序指針( PC )啟動地址,屬于非易失性存儲器空間范圍,如 ROM 、 FLASH 等。然而與上百兆的嵌入式處理器相比, FLASH 、 ROM 等存儲器響應(yīng)速度慢,已成為提高系統(tǒng)性能的一個瓶頸。而 SDRAM 具有很高的響應(yīng)速度,為何不使用 SDRAM 來執(zhí)行程序呢?為了提高系統(tǒng)整體速度,可以這樣設(shè)想,利用 FLASH 、 ROM 對系統(tǒng)進(jìn)行配置,把真正的應(yīng)用程序下載到 SDRAM 中運(yùn)行,這樣就可以提高系統(tǒng)的性能。然而這種想法又遇到了另外一個問題,當(dāng) ARM 處理器響應(yīng)異常事件時(shí),程序指針將要跳轉(zhuǎn)到一個確定的位置,假設(shè)發(fā)生了 IRQ 中斷, PC 將指向 0x18( 如果為高端啟動,則相應(yīng)指向 0vxffff_0018 處 ) ,而此時(shí) 0x18 處仍為非易失性存儲器所占據(jù)的位置,則程序的執(zhí)行還是有一部分要在 FLASH 或者 ROM 中來執(zhí)行的。那么我們可不可以使程序完全都 SDRAM 中運(yùn)行那?答案是肯定的,這就引入了 MMU ,利用 MMU ,可把 SDRAM 的地址完全映射到 0x0 起始的一片連續(xù)地址空間,而把原來占據(jù)這片空間的 FLASH 或者 ROM 映射到其它不相沖突的存儲空間位置。例如, FLASH 的地址從 0x0000_0000 - 0x00ff_ffff, 而 SDRAM 的地址范圍是 0x3000_0000 - 0x31ff_ffff ,則可把 SDRAM 地址映射為 0x0000_0000 - 0x1fff_ffff 而 FLASH 的地址可以映射到 0x9000_0000 - 0x90ff_ffff (此處地址空間為空閑,未被占用)。映射完成后,如果處理器發(fā)生異常,假設(shè)依然為 IRQ 中斷, PC 指針指向 0x18 處的地址,而這個時(shí)候 PC 實(shí)際上是從位于物理地址的 0x3000_0018 處讀取指令。通過 MMU 的映射,則可實(shí)現(xiàn)程序完全運(yùn)行在 SDRAM 之中。 

在實(shí)際的應(yīng)用中,可能會把兩片不連續(xù)的物理地址空間分配給 SDRAM 。而在操作系統(tǒng)中,習(xí)慣于把 SDRAM 的空間連續(xù)起來,方便內(nèi)存管理,且應(yīng)用程序申請大塊的內(nèi)存時(shí),操作系統(tǒng)內(nèi)核也可方便地分配。通過 MMU 可實(shí)現(xiàn)不連續(xù)的物理地址空間映射為連續(xù)的虛擬地址空間。 

操作系統(tǒng)內(nèi)核或者一些比較關(guān)鍵的代碼,一般是不希望被用戶應(yīng)用程序所訪問的。通過 MMU 可以控制地址空間的訪問權(quán)限,從而保護(hù)這些代碼不被破壞。 

二 MMU 地址映射的實(shí)現(xiàn) 
MMU 的實(shí)現(xiàn)過程,實(shí)際上就是一個查表映射的過程。建立頁表( translate table )是實(shí)現(xiàn) MMU 功能不可缺少的一步。頁表是位于系統(tǒng)的內(nèi)存中,頁表的每一項(xiàng)對應(yīng)于一個虛擬地址到物理地址的映射。每一項(xiàng)的長度即是一個字的長度(在 ARM 中,一個字的長度被定義為 4 字節(jié))。頁表項(xiàng)除完成虛擬地址到物理地址的映射功能之外,還定義了訪問權(quán)限和緩沖特性等。 

1 、映射存儲塊的分類  
MMU 支持基于節(jié)或頁的存儲器訪問, MMU 可以用下面四種大小進(jìn)行映射: 

節(jié) ( Section ) 構(gòu)成 1MB 的存儲器塊 

支持 3 中不同的頁尺寸: 

微頁 ( Tiny page ) 構(gòu)成 1KB 的存儲器塊 

小頁 ( Small page ) 構(gòu)成 4KB 的存儲器塊 

大頁 ( Large page ) 構(gòu)成 64KB 的存儲器塊 

其中對于節(jié)映射使用一級轉(zhuǎn)換表就可以了,而對于微頁、小頁、大頁則需要使用兩級轉(zhuǎn)換表。 

存在主存儲器內(nèi)的轉(zhuǎn)換表有兩個級別: 

2 、第一級轉(zhuǎn)換表 
  (注:本文中的頁表與轉(zhuǎn)換表同義)   

存儲節(jié)轉(zhuǎn)換表和指向第二級表的指針。 

 

注:   上圖中粗糙頁表欄中的最后一項(xiàng)應(yīng)為'01 ’ 

第一級表的每個入口是一個描述它所關(guān)聯(lián)的 1MB 虛擬地址是如何映射的描述符。見表 3-1 ,根據(jù) bits[1:0] 的組合,有四種可能: 

·   如果 bits[1:0]==0b00 ,所關(guān)聯(lián)的地址沒有被映射,試圖訪問他們將產(chǎn)生一個轉(zhuǎn)換錯( fault )。因?yàn)樗麄儽挥布雎裕攒浖梢岳眠@樣的描述符的 bits[31:2] 做自己的用途。推薦為描述符繼續(xù)保持正確的訪問權(quán)限。 

·   如果 bits[1:0]==0b10 ,這個入口是它所關(guān)聯(lián)地址的節(jié)描述符。見節(jié)描述符和轉(zhuǎn)換節(jié)參考中的細(xì)節(jié)。 

·   如果 bits[0]==1 ,這個入口給出粗糙第二級表( bit[1]==0 ),或精細(xì)第二級表( bit[1]==1 )。 

  

每一種類型的表描述了它所關(guān)聯(lián)的 1MB 存儲區(qū)域的映射。粗糙第二級表較小,每個表 1KB ,每個精細(xì)第二級表 4KB 。然而粗糙第二級表只能映射大頁和小頁,精細(xì)第二級表可以映射大頁、小頁和微頁。 

  節(jié)描述符和轉(zhuǎn)換節(jié)參考 

l         如果第一級描述符是節(jié)描述符,那么各個字段有如下的意義: 

Bits[1:0] 描述符類型標(biāo)識( 0b10 表示節(jié)描述符) 

Bits[3:2] 高速緩存和緩沖位 

Bits[4] 由具體實(shí)現(xiàn)定義 

Bits[8:5] 這個描述符控制的節(jié)的 16 種域之一 

Bits[9] 現(xiàn)在沒有使用,應(yīng)該為零 

Bits[11:10] 訪問控制,見表 3-3 

Bits[19:12] 現(xiàn)在沒有使用,應(yīng)該為零 

Bits[31:20] 節(jié)基址,形成物理地址的高 12 位 

l         如果第一級描述符是粗糙頁表描述符,那么各個字段有如下的意義: 

Bits[1:0] 描述符類型標(biāo)識( 0b01 表示粗糙頁表描述符) 

Bits[4:2] 由具體實(shí)現(xiàn)定義 

Bits[8:5] 這個描述符控制的頁的 16 種域之一 

Bits[9] 現(xiàn)在沒有使用,應(yīng)該為零 

Bits[31:10] 頁表基地址是一個指向第二極粗糙頁表的指針, 

l         如果第一級描述符是精細(xì)頁表描述符,那么各個字段有如下的意義: 

Bits[1:0] 描述符類型標(biāo)識( 0b11 表示精細(xì)頁表描述符) 

Bits[4:2] 由具體實(shí)現(xiàn)定義 

Bits[8:5] 這個描述符控制的頁的 16 種域之一 

Bits[11:9] 現(xiàn)在沒有使用,應(yīng)該為零 

Bits[31:10] 頁表基地址是一個指向第二級精細(xì)頁表的指針,它給出第二級表 

訪問的基地址。而第二級精細(xì)頁表必須在 4KB 邊界對齊。 

3 、第二級轉(zhuǎn)換表 
存儲大頁和小頁的轉(zhuǎn)換表。一種類型的第二級表存儲微頁轉(zhuǎn)換表。 

  

每個粗糙第二級表對映著以4KB 為單位的虛擬地址范圍市怎么映射的,每個精細(xì)第二級表對映著以1KB 為單位的虛擬地址范圍市怎么映射的。那些入口是頁描述符,他們能夠分別描述大于4KB 或1KB 的頁。在這種情況下,這個描述符必須被重復(fù)足夠次,以保證這個頁始終使用相同的描述符,不論訪問這個頁中的哪個虛擬地址。對于一個第二級描述符,有四種可能,由描述符的bits[1:0] 選擇。見表3-2 : 

· ? 如果bits[1:0]==0b00 ,說關(guān)聯(lián)的虛擬地址沒有被映射,任何對這些虛擬地址的訪問將會導(dǎo)致轉(zhuǎn)換錯(fault) 。軟件可以利用這樣的描述符的bits[31:2] 做自己的用途,因?yàn)樗麄儽挥布雎?。推薦為描述符繼續(xù)保持正確的訪問權(quán)限。 

· ? 如果bits[1:0]==0b01 ,這個入口是大頁描述符,描述64KB 的虛擬地址。 

見轉(zhuǎn)換大頁參考。一個大頁描述符在精細(xì)第二級表中必須被重復(fù)64 次,在粗 

糙第二級表中必須被重復(fù)16 次以保證所有的虛擬地址都被描述。 

· ? 如果bits[1:0]== 0b10 ,這個入口是小頁描述符,描述4KB 的虛擬地址。 

見轉(zhuǎn)換小頁參考。一個小頁描述符在精細(xì)第二級表中必須被重復(fù)4 次,以保 

證所有的虛擬地址都被描述。在粗糙第二級表中只有一個實(shí)例。 

· ? 如果bits[1:0]== 0b11 ,這個入口是微頁描述符,描述1KB 的虛擬地址。 

見轉(zhuǎn)換微頁參考。在精細(xì)第二級表中只需要一個微頁描述符的實(shí)例。微頁描 

述符不能在粗糙第二級表中出現(xiàn),如果出現(xiàn)了,結(jié)果不可預(yù)測。 


大頁描述符字段 

大頁描述符的字段有如下意義: 

bits[1:0] 表示描述符的類型 

bits[3:2] 高速緩促和緩沖位 

bits[11:4] 訪問權(quán)限位。這些為控制對頁的訪問。關(guān)于這些位的解釋見表3-3 。 

大頁被分成4 各子頁。 

AP0 編碼對第一個子頁的訪問權(quán)限。 

AP1 編碼對第二個子頁的訪問權(quán)限。 

AP2 編碼對第三個子頁的訪問權(quán)限。 

AP3 編碼對第四個子頁的訪問權(quán)限。 

bits[15:12] 現(xiàn)在沒有使用,應(yīng)該為零。 

bits[31:16] 用來形成物理地址的對應(yīng)位。 

 

小頁描述符字段 

小頁描述符的字段有如下意義: 

bits[1:0] 表示描述符的類型 

bits[3:2] 高速緩促和緩沖位 

bits[11:4] 訪問權(quán)限位。這些為控制對頁的訪問。關(guān)于這些位的解釋見表3-3 。 

小頁被分成4 各子頁。 

AP0 編碼對第一個子頁的訪問權(quán)限。 

AP1 編碼對第二個子頁的訪問權(quán)限。 

AP2 編碼對第三個子頁的訪問權(quán)限。 

AP3 編碼對第四個子頁的訪問權(quán)限。 

bits[31:12] 用來形成物理地址的對應(yīng)位。 

微頁描述符字段 

微頁描述符的字段有如下意義: 

bits[1:0] 表示描述符的類型 

bits[3:2] 高速緩促和緩沖位 

bits[5:4] 訪問權(quán)限位。這些為控制對頁的訪問。關(guān)于這些位的解釋見表3-3 關(guān)于微頁的解釋。 

bits[9:6] 現(xiàn)在沒有使用,應(yīng)該為零。 

bits[31:10] 用來形成物理地址的對應(yīng)位。   

  

MMU 把 CPU 產(chǎn)生的虛擬地址轉(zhuǎn)換成物理地址去訪問外部存儲器,同時(shí)繼承并檢查訪問權(quán)限。地址轉(zhuǎn)換有四條路徑。路徑的選取由這個地址是被標(biāo)記成節(jié)映射訪問還是頁映射訪問確定。頁映射訪問可以是大、小和微頁的訪問。 

  

MMU 的映射分為兩種,一級頁表的變換和二級頁表變換。兩者的不同之處就是所實(shí)現(xiàn)的變換地址空間大小不同。一級頁表變換支持 1M 大小的存儲空間的映射,而二級可以支持 64KB 、 4KB 和 1KB 大小地址空間的映射。 

要實(shí)現(xiàn)從虛擬地址到物理地址的映射,必然會遇到一個問題,如何找到這個頁表。對于表的查找,要知道這個表的基地址和偏移地址,在具有 MMU 功能的處理器中,集成了一個被稱為 CP15 的協(xié)處理器,該協(xié)處理器的 C2 寄存器中用于保存頁表的基地址, 

下面以一級頁表變換為例說明 MMU 實(shí)現(xiàn)地址變換的過程。   

4 、節(jié)訪問的轉(zhuǎn)換過程 
節(jié)和大頁是支持允許只用一個 TLB 入口去映射大的存儲器區(qū)間。小頁和大頁有附加的訪問控制:小頁分成 1KB 的子頁,和大頁分成 16KB 的子頁。微頁沒有子頁,對微頁的訪問控制是對整個頁。 

然而,轉(zhuǎn)換過程總是由下面所描述的那樣由第一級表的獲取開始。節(jié)映射的訪問只需要讀取第一級表,頁映射的訪問還需要讀取第二級表。 

1 轉(zhuǎn)換表基址 

當(dāng)片上( on-chip )的 TLB 中不包含被要求的虛擬地址的入口時(shí),轉(zhuǎn)換過程被啟動。轉(zhuǎn)換表基址寄存器( CP15 的寄存器 2 )保存著第一級轉(zhuǎn)換表基址的物理地址。只有 bits[31:14] 有效, bits[13:0] 應(yīng)該是零( SBZ )。所以第一級表必須在 16KB 的邊界。 

2 取第一級表 

轉(zhuǎn)換表基址寄存器的 bits[31:14] 與虛擬地址的 bits[31:20] 和兩個 0 位連接形成 32 為物理地址,如圖 3-2 。這個地址選擇了一個四字節(jié)的轉(zhuǎn)換表入口,它是第一級描述符或是指向第二級頁表的指針。 

  

當(dāng)處理器訪問一個虛擬地址時(shí),該虛擬地址的 [31 : 20] 作為偏移地址與頁基地址結(jié)合(基地址必須是 64KB 對齊的,因此基地址的 [13 : 0] 位都為 0 ),得到一個 32 位的頁表項(xiàng)地址(因?yàn)轫摫眄?xiàng)為 4 字節(jié)對齊, [1 : 0] 兩位為 0 )。通過這個頁表項(xiàng)地址可以檢索到該頁表項(xiàng)。頁表項(xiàng)的格式見前面第一級轉(zhuǎn)換表。 

查找到頁表項(xiàng)后,根據(jù)頁表項(xiàng)的訪問特性(緩沖以及是否允許訪問等)協(xié)處理器決定是否允許訪問。如不允許訪問,則協(xié)處理器向 CPU 報(bào)告出錯信息;反之,由頁表項(xiàng)的 [31 : 20] 位與虛擬地址的 [19 : 0] 一起組成實(shí)際的物理地址,實(shí)現(xiàn)從虛擬地址到物理地址的映射。如下圖所示: 

 

  

5 、粗糙二級表中的小頁轉(zhuǎn)換 
如果從第一級讀取到的是二級粗糙頁表描述符,那么會象下圖3-7 所示執(zhí)行第二級描述符讀取。   

6 、精細(xì)二級表中的微頁轉(zhuǎn)換 
如果從第一級讀取到的是二級精細(xì)頁表描述符,那么會象圖3-5 所示執(zhí)行第 

二級描述符讀取。  

7 、存儲器訪問的順序 
查找整個轉(zhuǎn)換表的過程叫轉(zhuǎn)換表遍歷。它由硬件制動進(jìn)行,并需要大量的執(zhí)行時(shí)間(至少一個存儲器訪問,通常是兩個)。為了減少存儲器訪問的平均消耗,轉(zhuǎn)換表遍歷結(jié)果被高速緩存在一個或多個叫作Translation Lookaside Buffers(TLBs) 的結(jié)構(gòu)中。通常在ARM 的實(shí)現(xiàn)中每個內(nèi)存接口有一個TLB 。 

因此,當(dāng) ARM 要訪問存儲器時(shí), MMU 先查找 TLB 中的虛擬地址表,如果 ARM 的結(jié)構(gòu)支持分開的地址 TLB 和指令 TLB ,那么它用: 

·   取指令使用指令 TLB 

·   其它的所有訪問類別用數(shù)據(jù) TLB 

如果 TLB 中沒有虛擬地址的入口,則轉(zhuǎn)換表遍歷硬件從存在主存儲器中的轉(zhuǎn)換表中獲取轉(zhuǎn)換和訪問權(quán)限,一旦取到,這些信息將被放在 TLB 中,它會放在一個沒有使用的入口處或覆蓋一個已有的入口。 

一旦為存儲器訪問的 TLB 的入口被拿到 , 這些信息將被用于: 

1. C (高速緩存)和 B (緩沖)位被用來控制高速緩存和寫緩沖,并決定是否高速緩存。(如果系統(tǒng)中沒有高速緩存和寫緩沖,則對應(yīng)的位將被忽略) 

2. 訪問權(quán)限和域位用來控制訪問是否被允許。如果不允許,則 MMU 將向 ARM 處理器發(fā)送一個存儲器異常;否則訪問將被允許進(jìn)行。 

 3. 對沒有高速緩存的系統(tǒng)(包括在沒有高速緩存系統(tǒng)中的所有存儲器訪問),物理地址將被用作主存儲器訪問的地址。對有高速緩存的系統(tǒng),在高速緩存沒有選中的情況下,物理地址將被用行取 (line fetch) 的地址。如果選中了高速緩存,則物理地址將被忽略。圖 3-1 說明了這種高速緩存系統(tǒng) 

  

三、協(xié)處理器 CP15 
MMU 由系統(tǒng)控制寄存器的2 、3 、4 、5 、6 、8 、10 號寄存器和1 號寄存器的一些位控制。 

5.1 對協(xié)處理器寄存器的操作 

ARM 寄存器到協(xié)處理器的數(shù)據(jù)傳誦指令和反向傳送指令分別為MCR  MRC    

l        MCR 

MCR 指令將ARM 處理器的寄存器中的數(shù)據(jù)傳送到協(xié)處理器的寄存器中。若協(xié)處理器不能成功執(zhí)行該操作,將產(chǎn)生未定義指令異常中斷。指令格式如下: 

MCR{cond} coproc ,opcode1 ,Rd ,CRn ,CRm{ ,opcode2} 

其中 coproc 指令操作的協(xié)處理器的名稱,標(biāo)準(zhǔn)名為pn ,n 為0~15 ,這里為p15 

     opcode1 協(xié)處理器的特定操作碼 

     Rd      做源的ARM 處理器寄存器 

     CRn     存放第一個操作數(shù)的協(xié)處理器寄存器 

     CRm     存放第二個操作數(shù)的協(xié)處理器寄存器 

     opcode2 可選的協(xié)處理器操作碼 

指令舉例如下: 

    MCR p6,2,R7,c1,c2 

MCR p7,0,R1,c3,c2,1 

  

l        MRC 

MRC 指令將協(xié)處理器的寄存器中的數(shù)據(jù)傳送到ARM 理器的寄存器中。若協(xié)處理器不能成功執(zhí)行該操作,將產(chǎn)生未定義指令異常中斷。指令格式如下: 

MRC{cond} coproc ,opcode1 ,Rd ,CRn ,CRm{ ,opcode2} 

其中 coproc 指令操作的協(xié)處理器的名稱,標(biāo)準(zhǔn)名為pn ,n 為0~15 ,這里為p15 

     opcode1 協(xié)處理器的特定操作碼 

     Rd      做目標(biāo)的ARM 處理器寄存器 

     CRn     存放第一個操作數(shù)的協(xié)處理器寄存器 

     CRm     存放第二個操作數(shù)的協(xié)處理器寄存器 

     opcode2 可選的協(xié)處理器操作碼 

指令舉例如下: 

     MRC p6,2,R7,c1,c2 

MCR p7,0,R1,c3,c2,1 

  

CP15 寄存器 0 , ID 代碼及緩存類型 
訪問:只讀 

CP 寄存器 0 包含詳細(xì)的硬件信息。讀訪問內(nèi)容由 opcode_2 域值確定。對寄存器 0 寫入結(jié)果無法預(yù)計(jì)。 

將 opcode_2 域置 0 后讀寄存器 0 訪問 ID 代碼寄存器 。 

將 opcode_2 域置 1 后讀寄存器 0 訪問緩存類型寄存器。緩存類型寄存器包含緩存大小與架構(gòu)信息?!?nbsp;

CP15 寄存器 1 ,控制 
訪問:讀 / 寫 

CP15 寄存器 1 或或稱為控制寄存器包含 ARM920T 控制位 

各個控制位的作用: 

M[0]: MMU 使能 

0 = MMU 禁用 

1 = MMU 使能 

A[1]: 隊(duì)列故障使能 

0 = 故障校驗(yàn)禁用 

1 = 故障校驗(yàn)使能 

C[2]: DCache 使能 

0 = DCache 禁用 

1 = DCache 使能 

B[7]: Endianness 

0 = 小 endian 模式 

1 = 大 endian 模式 

S[8]: 系統(tǒng)保護(hù) 

修改 MMU 保護(hù)系統(tǒng) 

詳見 ARM920T 技術(shù)參考手冊 Rev. DDI0151C 。 

R[9]: ROM 保護(hù) 

修改 MMU 保護(hù)系統(tǒng) 

詳見 ARM920T 技術(shù)參考手冊 Rev. DDI0151C 。 

I[12]: ICache 控制 

0 = ICache 禁用 

1 = ICache 使能 

V[13]: 異常寄存器基地址 

0 = 低地址,為 0x00000000 

1 = 高地址,為 0xFFFF0000 

RR[14]: Round Robin 置換 

0 = 隨機(jī)置換 

1 = Round robin 置換 

  

CP15 寄存器 2, TTB 
訪問:讀 / 寫 

CP15 寄存器 2 ,或轉(zhuǎn)換表基 (TTB) 寄存器,定義轉(zhuǎn)換表第一級,用于存放頁表基址 

讀 CP15 寄存器 2 時(shí),在 bits[31:14] 返回當(dāng)前活動的第一級轉(zhuǎn)換表的物理地址, bits[13:0] 不確定。讀 CP15 寄存器 2 時(shí), CRm 和操作數(shù) 2 被忽略,并應(yīng)該是 0 。 

寫 CP15 寄存器 2 時(shí),在 bits[31:14] 更新當(dāng)前活動的第一級轉(zhuǎn)換表的物理地址, bits[13:0] 應(yīng)該寫 0 或先前讀回的值。寫 CP15 寄存器 2 時(shí), CRm 和操作數(shù) 2 被忽略,并應(yīng)該是 0 。 

  

  

CP15 寄存器 3 ,域訪問控制寄存器 
訪問:讀 / 寫 

CP 15 寄存器 3 ,或域訪問控制寄存器,定義允許域訪問。 

使用 16 域進(jìn)行 MMU 訪問優(yōu)先級控制。 

寄存器 3 中的每兩位對應(yīng)一個域。 

域是節(jié)、大頁和小頁的集合。 ARM 結(jié)構(gòu)支持 16 個域。對域的訪問由域訪問控制寄存器的兩個位字段控制。因?yàn)槊總€字段對訪問對應(yīng)的域的使能非常迅速,所以整個存儲器區(qū)間能很快地交換進(jìn)出虛擬存儲器。這里支持 2 種域訪問方式: 

客戶域的用戶(執(zhí)行程序,訪問數(shù)據(jù)),被形成這個域的節(jié)或頁來監(jiān)督訪問權(quán)限。 

管理者控制域的行為(域中的當(dāng)前節(jié)和頁,對域的訪問),不被形成這個域的節(jié)或頁來監(jiān)督訪問權(quán)限。 

一個程序可以是一些域的客戶,也是另外一些域的管理者,同時(shí)沒有對其它域的訪問權(quán)限。這允許對程序訪問不同存儲器資源的非常靈活的存儲器保護(hù)。表 3-4 說明了域訪問控制寄存器的位編碼方式。 

(域的作用即對于每一個存儲塊如節(jié)、大頁和小頁,設(shè)置能否訪問這些存儲塊,或者訪問這些存儲塊時(shí)是否需要進(jìn)行在轉(zhuǎn)換表中所設(shè)置的權(quán)限的檢查) 

  

CP15寄存器4,保留 對該寄存器的訪問( 讀或?qū)? 結(jié)果無法預(yù)見。

CP15寄存器5,故障狀態(tài)寄存器
訪問:讀/ 寫

讀CP 15 寄存器5,或故障狀態(tài)寄存器(FSR),返回最后數(shù)據(jù)故障源,表示當(dāng)數(shù)據(jù)中止出現(xiàn)時(shí)嘗試訪問的域與類型。

此外,將引起數(shù)據(jù)中止的虛擬地址寫入故障地址寄存器(CP15 寄存器6)。

寫CP 15 寄存器5,或故障狀態(tài)寄存器(FSR),設(shè)置數(shù)據(jù)寫入時(shí)FSR 值。用于調(diào)試器恢復(fù)FSR中值。

• Status[3:0]: 故障類型

說明故障類型。當(dāng)數(shù)據(jù)中止出現(xiàn)時(shí)由MMU對狀態(tài)域編碼。狀態(tài)域譯碼由域名及與數(shù)據(jù)中止相關(guān)的MVA(存于FAR中)確定。

• Domain[7:4]: 域

說明當(dāng)故障出現(xiàn)時(shí)訪問的域(D15 - D0)。

當(dāng)寫入時(shí),未定義位為0,讀出時(shí)結(jié)果無法預(yù)見。

CP15寄存器6,故障地址寄存器
訪問:讀/ 寫

CP 15寄存器6,或故障地址寄存器(FAR),包含當(dāng)最后故障出現(xiàn)時(shí)嘗試訪問的MVA 。FAR只會因數(shù)據(jù)故障而改變,不會因預(yù)取故障改變。

對FAR 的寫性能,允許調(diào)試器保存一個先前狀態(tài)。

CP15寄存器7,緩存工作寄存器
訪問: 只寫

CP15寄存器7,或緩存工作寄存器,用以管理指令緩存(ICache) 與數(shù)據(jù)緩存(DCache)。

每個緩存工作功能由pcode_2 及使用寫CP15 寄存器7 的MCR 指令的CRm 域選定。

詳細(xì)內(nèi)容參照手冊。

CP15寄存器8, TLB 工作寄存器
訪問: 只讀

CP15寄存器8,或轉(zhuǎn)換后備緩沖器(TLB)工作寄存器,用于管理指令TLB與數(shù)據(jù)TLB。

使用opcode_2及寫CP15 寄存器8 的MCR 指令中的CRm域選定TLB 工作 。

TLB:Translation Lookaside Buffer. 根據(jù)功能可以譯為快表,直譯可以翻譯為旁路轉(zhuǎn)換緩沖,也可以把它理解成頁表緩沖.里面存放的是一些頁表文件(虛擬地址到物理地址的轉(zhuǎn)換表).當(dāng)處理器要在主內(nèi)存尋址時(shí),不是直接在內(nèi)存的物理地址里查找的,而是通過一組虛擬地址轉(zhuǎn)換到主內(nèi)存的物理地址,TLB就是負(fù)責(zé)將虛擬內(nèi)存地址翻譯成實(shí)際的物理內(nèi)存地址,而CPU尋址時(shí)會優(yōu)先在TLB中進(jìn)行尋址.處理器的性能就和尋址的命中率有很大的關(guān)系.
二,為什么要引入TLB:
映射機(jī)制必須使一個程序能斷言某個地址在其自己的進(jìn)程空間或地址空間內(nèi),并且能夠高效的將其轉(zhuǎn)換為真實(shí)的物理地址以訪問內(nèi)存.一個方法是使用一個含有整個空間內(nèi)所有頁的入口(entry)的表(即頁表),每個入口包含這個頁的正確物理地址.這很明顯是個相當(dāng)大的數(shù)據(jù)結(jié)構(gòu),因而不得不存放于主存之中.
由于CPU首先接到的是由程序傳來的虛擬內(nèi)存地址,所以CPU必須先到物理內(nèi)存中取頁表,然后對應(yīng)程序傳來的虛擬頁面號,在表里找到對應(yīng)的物理頁面號,最后才能訪問實(shí)際的物理內(nèi)存地址,也就是說整個過程中CPU必須訪問兩次物理內(nèi)存(實(shí)際上訪問的次數(shù)更多).因此,為了減少CPU訪問物理內(nèi)存的次數(shù),引入TLB.。通常在ARM 的實(shí)現(xiàn)中每個內(nèi)存接口有一個TLB。

·  有一個存儲器接口的系統(tǒng)通常有一個唯一的TLB

·  指令和數(shù)據(jù)的內(nèi)存接口分開的系統(tǒng)通常有分開的指令TLB 和數(shù)據(jù)TLB

當(dāng)存儲器中的轉(zhuǎn)換表被改變或選中了不同的轉(zhuǎn)換表(通過寫CP15 的寄存器2),先前在TLB中的轉(zhuǎn)換表遍歷結(jié)果將不再有效。MMU 結(jié)構(gòu)提供了刷新TLB 的操作。MMU 結(jié)構(gòu)也允許特定的轉(zhuǎn)換表遍歷結(jié)果被鎖定在一個TLB 中,這就保證了對相關(guān)的存儲器區(qū)域的訪問絕不會導(dǎo)致轉(zhuǎn)換表遍歷,這也對那些把指令和數(shù)據(jù)鎖定在高速緩存中的實(shí)時(shí)代碼有相同的好處。


 

試圖用MRC 指令讀CP15 寄存器8 的結(jié)果不確定。當(dāng)只有很少量的存儲器被重新映射時(shí),無效的單一入口操作能被用來在一些實(shí)現(xiàn)中改善性能。對每個被重新映射的存儲器區(qū)域(節(jié)、小頁或大頁),無效的單一入口需要在存儲器區(qū)域的虛擬地址上執(zhí)行。性能的改善來源于不用重新裝載與沒有被重新映射的存儲器區(qū)域相關(guān)的TLB 入口。

---小心------

當(dāng)存儲器被重新映射時(shí)必須使與舊的映射相關(guān)的TLB 入口無效。如果不這樣,可能會進(jìn)入兩個TLB 入口覆蓋虛擬地址范圍的狀態(tài)。在最好的情況下訪問這樣的覆蓋虛擬地址范圍會有不可預(yù)料的結(jié)果;在某些實(shí)現(xiàn)中甚至?xí)锢頁p壞MMU。強(qiáng)烈建議在重新映射存儲器時(shí)要加倍小心使TLB 適當(dāng)?shù)厥А?/div>

------------ 

 

CP15寄存器9,緩存上鎖寄存器
訪問: 讀/ 寫

CP15寄存器9,或緩存上鎖寄存器,復(fù)位時(shí)值為0x0。緩存上鎖寄存器允許軟件控制在ICache或DCache上的緩存線上載入填充。防止在填充時(shí)ICache 或 DCache 被驅(qū)逐,將其鎖定在緩存中。

由CP15 寄存器9 讀取返回緩存上鎖寄存器值,即所有緩存段的基地址指針。只返回[31:26],其它值不可預(yù)見。

對CP15 寄存器9 寫入更新緩存上鎖寄存器,所有緩存段基地址與當(dāng)前地址指針更新。


CP15寄存器10, TLB 上鎖寄存器
訪問: 讀/ 寫

CP15寄存器10,或 TLB上鎖寄存器復(fù)位時(shí)值為0x0。每個TLB均有一個TLSB上鎖寄存器;opcode_2值確定訪問哪個TLB寄存器:

• opcode_2 = 0x0 , D TLB 寄存器

• opcode_2 = 0x1, I TLB寄存器

轉(zhuǎn)換表遍歷的執(zhí)行需要一定的時(shí)間,特別當(dāng)訪問慢速的主存儲器時(shí)。在實(shí)時(shí)中斷處理程序中,當(dāng)TLB 不包含中斷處理程序的轉(zhuǎn)換和/或要訪問的數(shù)據(jù)時(shí),中斷延遲回大量加長。

TLB 鎖定是一些ARM 存儲器系統(tǒng)的特性,它允許把特定的轉(zhuǎn)換表遍歷的結(jié)果裝載到TLB 中。這種方式不會被后來的轉(zhuǎn)換表遍歷的結(jié)果覆蓋。由CP15 寄存器10 設(shè)定。設(shè) W=LOG2(TLB 入口數(shù)),如果需要的話取整(round-up),則CP15 寄存器10 的格式為: 

如果具體的實(shí)現(xiàn)有分開的指令和數(shù)據(jù)TLB,那么有2 個不同的寄存器,由訪問寄存器10 的MCR 或MRC 指令中的opcode2 字段選擇: 

opcode2 == 0 選擇數(shù)據(jù)TLB 鎖定寄存器

opcode2 == 1 選擇指令TLB 鎖定寄存器

如果具體的實(shí)現(xiàn)只有唯一的TLB,那么只有1 個寄存器,opcode2 字段應(yīng)該為0。訪問寄存器10 的MCR 或MRC 指令中的CRm 總應(yīng)該為0。

寫寄存器10 有如下結(jié)果:

victim 字段表示下次TLB 失敗(miss)時(shí),轉(zhuǎn)換表遍歷的結(jié)果替代哪個TLB 入口。Base 字段包含TLB 替換的策略,只使用從(base)到(TLB 入口-1)的TLB 入口,victim 應(yīng)該在這個區(qū)間。

轉(zhuǎn)換表遍歷的結(jié)果在寫到TLB 入口時(shí),若P==1 則它被保護(hù)起來,不能被寄存器8的使整個TLB 失效操作影響;若P==0 則會被那些操作給失效掉。

---注------

如果TLB 的入口不是2 的N 次方,那么寫到大于或等于TLB 入口數(shù)的TLB 入口的base 或victim 的值將不確定。

-----------

讀寄存器10 將返回它的值。 

CP15寄存器11, 12,保留
對這些寄存器的訪問( 讀或?qū)? 結(jié)果不可預(yù)見。

CP15寄存器13, FCSE PID寄存器
訪問: 讀/ 寫

CP15寄存器13,或快速前后切換擴(kuò)展(FCSE)處理標(biāo)識符(PID) 寄存器,復(fù)位時(shí)值為0x0。

由CP15 寄存器13讀取返回FCSE PID值。

向CP15 寄存器13寫入置位FCSE PID。

FCSE PID 設(shè)置ARM9TDMI 與緩存存儲器MMU 間映射。

ARM9TDMI 地址范圍為0 ~ 32 M字節(jié),通過FCSE PID 轉(zhuǎn)換。

CP15寄存器14, 保留
對這些寄存器的訪問( 讀或?qū)? 結(jié)果不可預(yù)見。

CP15寄存器15,測試配置寄存器
CP15寄存器15,或測試配置寄存器用于測試。對該寄存器的訪問( 讀或?qū)? 結(jié)果不可預(yù)見。

 

 

 

 

 

四、設(shè)置MMU
下面是一個設(shè)置MMU進(jìn)行地址重映射的一個實(shí)例

對于實(shí)際編程工作而言,主要是確定如何編寫頁表中的內(nèi)容并如何確定頁表項(xiàng)地址?,F(xiàn)舉例如下:

假設(shè)物理地址為0x3000_0000~0x30ff_ffff(1M空間)的一塊連續(xù)空間需映射為0x0000_0000~0x000f_ffff的一塊連續(xù)空間:

1.確定頁表項(xiàng)中的內(nèi)容:把物理地址的基地址作為頁表項(xiàng)的高12位(31bit~21bit),填寫訪問屬性。假設(shè)可以讀寫,可以讀緩存、寫緩沖,這樣該頁表項(xiàng)內(nèi)容為0x3000_C00E;

2.確定頁表基地址,填寫頁表基地址到CP15寄存器的C2中。頁表的基地址要為64KB對齊,此處為0x305f_c000;

3.計(jì)算出偏移地址,把內(nèi)容填寫到頁表項(xiàng)地址中。頁表項(xiàng)地址=頁表基地址+(虛擬地址基地址>>18),如頁表基地址為0x305f_c000,那么,頁表項(xiàng)地址=0x305f_c000;

4.將頁表項(xiàng)數(shù)值寫到對應(yīng)的頁表項(xiàng)地址中。上例中,需要向地址0x305f_c000中寫入0x3000_COOE。

下面是程序的具體實(shí)現(xiàn) 
;init MMU
;寫MMU表到on chip sram from 0x60010000 to 0x60014000    

        import write_mmu_table
        
        ldr r0,=table ;0x305f_c000

        bl write_mmu_table ;
        nop
        nop
        ldr      r2,=0x55555555
    mcr      p15,0x0,r2,c3,c0,0 ;16個域均為0b01,客戶模式
    
    nop
    nop
    nop
    nop
    
    ldr r0,=table ;
    mcr      p15,0x0,r0,c2,c0,0 ;變換表基地址寫入cp15 r2
    nop
    nop
    nop
    nop
    mov      r2,#0x7d ;0b0111 1101,使能cache,write buffer,MMU
    mcr      p15,0x0,r2,c1,c0,0
    nop
    nop
    nop
    nop
    nop
    nop
    就這些,mmu初始化完了
write_mmu_table()是c的小程序,往ram寫地址轉(zhuǎn)換的描述
void write_mmu_table(UINT32 *base)
{
        UINT32 *p_table;
        UINT32 description;
        UINT32 i;
        
        p_table = base;
        description = 0x3000_C00E; //頁表項(xiàng)的值
         *p_table = description;

     p_table++;
        description = 0x31000c10  //下面使除了上面映射地址之外,所有的虛擬地址都為無效 
                                                        //地址..bits[1:0]==0b00,所關(guān)聯(lián)的地址沒有被映射
        for (i=1;i<4096;i++)
        {
                *p_table = description;
                description = description +0x00100000;
                p_table ++;     
        }       

    //return;
}



本篇文章來源于 Linux公社網(wǎng)站(www.)  原文鏈接:http://www./Linux/2011-09/43525.htm

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产传媒免费观看视频| 青青操视频在线观看国产| 欧美日韩一级黄片免费观看| 五月天丁香婷婷狠狠爱| 国产av熟女一区二区三区四区| 国产精品刮毛视频不卡| 亚洲精品美女三级完整版视频| 日本一品道在线免费观看| 欧美整片精品日韩综合| 色哟哟精品一区二区三区| 中文字幕日韩一区二区不卡| 久久人人爽人人爽大片av| 国产高清视频一区不卡| 日韩在线视频精品中文字幕| 中文字幕乱码一区二区三区四区 | 中文字幕五月婷婷免费| 国产av一区二区三区久久不卡| 精品精品国产自在久久高清| 国产一级特黄在线观看| 久久re6热在线视频| 亚洲免费观看一区二区三区| 欧美一级不卡视频在线观看| 久久精品国产99国产免费| 国产精品一区二区成人在线| 久久午夜福利精品日韩| 性感少妇无套内射在线视频| 在线免费看国产精品黄片| 国产欧美日韩精品一区二区| 日本视频在线观看不卡| 偷自拍亚洲欧美一区二页| 加勒比系列一区二区在线观看| 麻豆国产精品一区二区三区| 国产在线不卡中文字幕| 色婷婷视频免费在线观看| 福利视频一区二区在线| 国产一区二区三区av在线| 中文字幕精品一区二区三| 日韩日韩日韩日韩在线| 少妇人妻一级片一区二区三区 | 国产精品一级香蕉一区| 欧美人妻少妇精品久久性色|