<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM內存管理MMU詳解

ARM內存管理MMU詳解

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏
嵌入式系統中,存儲系統差別很大,可包含多種類(lèi)型的存儲器件,如 FLASH , SRAM , SDRAM , ROM 等,這些不同類(lèi)型的存儲器件速度和寬度等各不相同;在訪(fǎng)問(wèn)存儲單元時(shí),可能采取平板式的地址映射機制對其操作,或需要使用虛擬地址對其進(jìn)行讀寫(xiě);系統中,需引入存儲保護機制,增強系統的安全性。為適應如此復雜的存儲體系要求, ARM 處理器中引入了存儲管理單元來(lái)管理存儲系統。

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

本文引用地址:http://dyxdggzs.com/article/201611/318748.htm

在實(shí)際的應用中,可能會(huì )把兩片不連續的物理地址空間分配給 SDRAM 。而在操作系統中,習慣于把 SDRAM 的空間連續起來(lái),方便內存管理,且應用程序申請大塊的內存時(shí),操作系統內核也可方便地分配。通過(guò) MMU 可實(shí)現不連續的物理地址空間映射為連續的虛擬地址空間。

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

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

1 、映射存儲塊的分類(lèi) 
MMU 支持基于節或頁(yè)的存儲器訪(fǎng)問(wèn), MMU 可以用下面四種大小進(jìn)行映射:

節 ( Section ) 構成 1MB 的存儲器塊
支持 3 中不同的頁(yè)尺寸:

微頁(yè) ( Tiny page ) 構成 1KB 的存儲器塊
小頁(yè) ( Small page ) 構成 4KB 的存儲器塊
大頁(yè) ( Large page ) 構成 64KB 的存儲器塊
其中對于節映射使用一級轉換表就可以了,而對于微頁(yè)、小頁(yè)、大頁(yè)則需要使用兩級轉換表。

存在主存儲器內的轉換表有兩個(gè)級別:

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

存儲節轉換表和指向第二級表的指針。

注: 上圖中粗糙頁(yè)表欄中的最后一項應為‘01 ’

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

· 如果 bits[1:0]==0b00 ,所關(guān)聯(lián)的地址沒(méi)有被映射,試圖訪(fǎng)問(wèn)他們將產(chǎn)生一個(gè)轉換錯( fault )。因為他們被硬件忽略,所以軟件可以利用這樣的描述符的 bits[31:2] 做自己的用途。推薦為描述符繼續保持正確的訪(fǎng)問(wèn)權限。

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

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

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

節描述符和轉換節參考
l 如果第一級描述符是節描述符,那么各個(gè)字段有如下的意義:

Bits[1:0] 描述符類(lèi)型標識( 0b10 表示節描述符)

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

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

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

Bits[9] 現在沒(méi)有使用,應該為零

Bits[11:10] 訪(fǎng)問(wèn)控制,見(jiàn)表 3-3

Bits[19:12] 現在沒(méi)有使用,應該為零

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

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

Bits[1:0] 描述符類(lèi)型標識( 0b01 表示粗糙頁(yè)表描述符)

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

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

Bits[9] 現在沒(méi)有使用,應該為零

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

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

Bits[1:0] 描述符類(lèi)型標識( 0b11 表示精細頁(yè)表描述符)

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

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

Bits[11:9] 現在沒(méi)有使用,應該為零

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

訪(fǎng)問(wèn)的基地址。而第二級精細頁(yè)表必須在 4KB 邊界對齊。

3 、第二級轉換表 存儲大頁(yè)和小頁(yè)的轉換表。一種類(lèi)型的第二級表存儲微頁(yè)轉換表。

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

· ? 如果bits[1:0]==0b00 ,說(shuō)關(guān)聯(lián)的虛擬地址沒(méi)有被映射,任何對這些虛擬地

址的訪(fǎng)問(wèn)將會(huì )導致轉換錯(fault) 。軟件可以利用這樣的描述符的bits[31:2] 做自己的用途,因為他們被硬件忽略。推薦為描述符繼續保持正確的訪(fǎng)問(wèn)權限。

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

見(jiàn)轉換大頁(yè)參考。一個(gè)大頁(yè)描述符在精細第二級表中必須被重復64 次,在粗

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

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

見(jiàn)轉換小頁(yè)參考。一個(gè)小頁(yè)描述符在精細第二級表中必須被重復4 次,以保

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

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

見(jiàn)轉換微頁(yè)參考。在精細第二級表中只需要一個(gè)微頁(yè)描述符的實(shí)例。微頁(yè)描

述符不能在粗糙第二級表中出現,如果出現了,結果不可預測。


大頁(yè)描述符字段
大頁(yè)描述符的字段有如下意義:

bits[1:0] 表示描述符的類(lèi)型

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

bits[11:4] 訪(fǎng)問(wèn)權限位。這些為控制對頁(yè)的訪(fǎng)問(wèn)。關(guān)于這些位的解釋見(jiàn)表3-3 。

大頁(yè)被分成4 各子頁(yè)。

AP0 編碼對第一個(gè)子頁(yè)的訪(fǎng)問(wèn)權限。

AP1 編碼對第二個(gè)子頁(yè)的訪(fǎng)問(wèn)權限。

AP2 編碼對第三個(gè)子頁(yè)的訪(fǎng)問(wèn)權限。

AP3 編碼對第四個(gè)子頁(yè)的訪(fǎng)問(wèn)權限。

bits[15:12] 現在沒(méi)有使用,應該為零。

bits[31:16] 用來(lái)形成物理地址的對應位。

?

小頁(yè)描述符字段
小頁(yè)描述符的字段有如下意義:

bits[1:0] 表示描述符的類(lèi)型

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

bits[11:4] 訪(fǎng)問(wèn)權限位。這些為控制對頁(yè)的訪(fǎng)問(wèn)。關(guān)于這些位的解釋見(jiàn)表3-3 。

小頁(yè)被分成4 各子頁(yè)。

AP0 編碼對第一個(gè)子頁(yè)的訪(fǎng)問(wèn)權限。

AP1 編碼對第二個(gè)子頁(yè)的訪(fǎng)問(wèn)權限。

AP2 編碼對第三個(gè)子頁(yè)的訪(fǎng)問(wèn)權限。

AP3 編碼對第四個(gè)子頁(yè)的訪(fǎng)問(wèn)權限。

bits[31:12] 用來(lái)形成物理地址的對應位。

微頁(yè)描述符字段
微頁(yè)描述符的字段有如下意義:

bits[1:0] 表示描述符的類(lèi)型

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

bits[5:4] 訪(fǎng)問(wèn)權限位。這些為控制對頁(yè)的訪(fǎng)問(wèn)。關(guān)于這些位的解釋見(jiàn)表3-3 關(guān)于微頁(yè)的解釋。

bits[9:6] 現在沒(méi)有使用,應該為零。

bits[31:10] 用來(lái)形成物理地址的對應位。

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

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

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

下面以一級頁(yè)表變換為例說(shuō)明 MMU 實(shí)現地址變換的過(guò)程。

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

然而,轉換過(guò)程總是由下面所描述的那樣由第一級表的獲取開(kāi)始。節映射的訪(fǎng)問(wèn)只需要讀取第一級表,頁(yè)映射的訪(fǎng)問(wèn)還需要讀取第二級表。

1 轉換表基址

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

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

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

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

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

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

二級描述符讀取。

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

因此,當 ARM 要訪(fǎng)問(wèn)存儲器時(shí), MMU 先查找 TLB 中的虛擬地址表,如果 ARM 的結構支持分開(kāi)的地址 TLB 和指令 TLB ,那么它用:

· 取指令使用指令 TLB

· 其它的所有訪(fǎng)問(wèn)類(lèi)別用數據 TLB

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

一旦為存儲器訪(fǎng)問(wèn)的 TLB 的入口被拿到 , 這些信息將被用于:

1. C (高速緩存)和 B (緩沖)位被用來(lái)控制高速緩存和寫(xiě)緩沖,并決定是否高速緩存。(如果系統中沒(méi)有高速緩存和寫(xiě)緩沖,則對應的位將被忽略)

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

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

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

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

l MCR

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

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

其中 coproc 指令操作的協(xié)處理器的名稱(chēng),標準名為pn ,n 為0~15 ,這里為p15

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

Rd 做源的ARM 處理器寄存器

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

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

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

指令舉例如下:

MCR p6,2,R7,c1,c2

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

l MRC

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

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

其中 coproc 指令操作的協(xié)處理器的名稱(chēng),標準名為pn ,n 為0~15 ,這里為p15

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

Rd 做目標的ARM 處理器寄存器

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

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

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

指令舉例如下:

MRC p6,2,R7,c1,c2

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

CP15 寄存器 0 , ID 代碼及緩存類(lèi)型
訪(fǎng)問(wèn):只讀

CP 寄存器 0 包含詳細的硬件信息。讀訪(fǎng)問(wèn)內容由 opcode_2 域值確定。對寄存器 0 寫(xiě)入結果無(wú)法預計。

將 opcode_2 域置 0 后讀寄存器 0 訪(fǎng)問(wèn) ID 代碼寄存器 。

將 opcode_2 域置 1 后讀寄存器 0 訪(fǎng)問(wèn)緩存類(lèi)型寄存器。緩存類(lèi)型寄存器包含緩存大小與架構信息?!?/p>

CP15 寄存器 1 ,控制
訪(fǎng)問(wèn):讀 / 寫(xiě)

CP15 寄存器 1 或或稱(chēng)為控制寄存器包含 ARM920T 控制位

各個(gè)控制位的作用:

• M[0]: MMU 使能

0 = MMU 禁用

1 = MMU 使能

• A[1]: 隊列故障使能

0 = 故障校驗禁用

1 = 故障校驗使能

• C[2]: DCache 使能

0 = DCache 禁用

1 = DCache 使能

• B[7]: Endianness

0 = 小 endian 模式

1 = 大 endian 模式

• S[8]: 系統保護

修改 MMU 保護系統

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

• R[9]: ROM 保護

修改 MMU 保護系統

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

• I[12]: ICache 控制

0 = ICache 禁用

1 = ICache 使能

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

0 = 低地址,為 0x00000000

1 = 高地址,為 0xFFFF0000

• RR[14]: Round Robin 置換

0 = 隨機置換

1 = Round robin 置換

CP15 寄存器 2, TTB
訪(fǎng)問(wèn):讀 / 寫(xiě)

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

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

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

CP15 寄存器 3 ,域訪(fǎng)問(wèn)控制寄存器
訪(fǎng)問(wèn):讀 / 寫(xiě)

CP 15 寄存器 3 ,或域訪(fǎng)問(wèn)控制寄存器,定義允許域訪(fǎng)問(wèn)。

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

寄存器 3 中的每?jì)晌粚粋€(gè)域。

域是節、大頁(yè)和小頁(yè)的集合。 ARM 結構支持 16 個(gè)域。對域的訪(fǎng)問(wèn)由域訪(fǎng)問(wèn)控制寄存器的兩個(gè)位字段控制。因為每個(gè)字段對訪(fǎng)問(wèn)對應的域的使能非常迅速,所以整個(gè)存儲器區間能很快地交換進(jìn)出虛擬存儲器。這里支持 2 種域訪(fǎng)問(wèn)方式:

客戶(hù)域的用戶(hù)(執行程序,訪(fǎng)問(wèn)數據),被形成這個(gè)域的節或頁(yè)來(lái)監督訪(fǎng)問(wèn)權限。

管理者控制域的行為(域中的當前節和頁(yè),對域的訪(fǎng)問(wèn)),不被形成這個(gè)域的節或頁(yè)來(lái)監督訪(fǎng)問(wèn)權限。

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

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

CP15寄存器4,保留

對該寄存器的訪(fǎng)問(wèn)( 讀或寫(xiě)) 結果無(wú)法預見(jiàn)。

CP15寄存器5,故障狀態(tài)寄存器
訪(fǎng)問(wèn):讀/ 寫(xiě)

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

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

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

Status[3:0]: 故障類(lèi)型

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

Domain[7:4]: 域

說(shuō)明當故障出現時(shí)訪(fǎng)問(wèn)的域(D15 - D0)。

當寫(xiě)入時(shí),未定義位為0,讀出時(shí)結果無(wú)法預見(jiàn)。

CP15寄存器6,故障地址寄存器
訪(fǎng)問(wèn):讀/ 寫(xiě)

CP 15寄存器6,或故障地址寄存器(FAR),包含當最后故障出現時(shí)嘗試訪(fǎng)問(wèn)的MVA 。FAR只會(huì )因數據故障而改變,不會(huì )因預取故障改變。

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

CP15寄存器7,緩存工作寄存器
訪(fǎng)問(wèn): 只寫(xiě)

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

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

詳細內容參照手冊。

CP15寄存器8, TLB 工作寄存器
訪(fǎng)問(wèn): 只讀

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

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

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

· 有一個(gè)存儲器接口的系統通常有一個(gè)唯一的TLB

· 指令和數據的內存接口分開(kāi)的系統通常有分開(kāi)的指令TLB 和數據TLB

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


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

---小心------

當存儲器被重新映射時(shí)必須使與舊的映射相關(guān)的TLB 入口無(wú)效。如果不這樣,可能會(huì )進(jìn)入兩個(gè)TLB 入口覆蓋虛擬地址范圍的狀態(tài)。在最好的情況下訪(fǎng)問(wèn)這樣的覆蓋虛擬地址范圍會(huì )有不可預料的結果;在某些實(shí)現中甚至會(huì )物理?yè)p壞MMU。強烈建議在重新映射存儲器時(shí)要加倍小心使TLB 適當地失效。

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

CP15寄存器9,緩存上鎖寄存器
訪(fǎng)問(wèn): 讀/ 寫(xiě)

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

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

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


CP15寄存器10, TLB 上鎖寄存器
訪(fǎng)問(wèn): 讀/ 寫(xiě)

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

opcode_2 = 0x0 , D TLB 寄存器

opcode_2 = 0x1, I TLB寄存器

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

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

如果具體的實(shí)現有分開(kāi)的指令和數據TLB,那么有2 個(gè)不同的寄存器,由訪(fǎng)問(wèn)寄存器10 的MCR 或MRC 指令中的opcode2 字段選擇:

opcode2 == 0 選擇數據TLB 鎖定寄存器

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

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

寫(xiě)寄存器10 有如下結果:

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

轉換表遍歷的結果在寫(xiě)到TLB 入口時(shí),若P==1 則它被保護起來(lái),不能被寄存器8的使整個(gè)TLB 失效操作影響;若P==0 則會(huì )被那些操作給失效掉。

---注------

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

-----------

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

CP15寄存器11, 12,保留
對這些寄存器的訪(fǎng)問(wèn)( 讀或寫(xiě)) 結果不可預見(jiàn)。

CP15寄存器13, FCSE PID寄存器
訪(fǎng)問(wèn): 讀/ 寫(xiě)

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

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

向CP15 寄存器13寫(xiě)入置位FCSE PID。

FCSE PID 設置ARM9TDMI 與緩存存儲器MMU 間映射。

ARM9TDMI 地址范圍為0 ~ 32 M字節,通過(guò)FCSE PID 轉換。

CP15寄存器14, 保留
對這些寄存器的訪(fǎng)問(wèn)( 讀或寫(xiě)) 結果不可預見(jiàn)。

CP15寄存器15,測試配置寄存器
CP15寄存器15,或測試配置寄存器用于測試。對該寄存器的訪(fǎng)問(wèn)( 讀或寫(xiě)) 結果不可預見(jiàn)。

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

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

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

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

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

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

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

下面是程序的具體實(shí)現
;init MMU
;寫(xiě)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個(gè)域均為0b01,客戶(hù)模式

nop
nop
nop
nop

ldr r0,=table ;
mcr p15,0x0,r0,c2,c0,0 ;變換表基地址寫(xiě)入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寫(xiě)地址轉換的描述
void write_mmu_table(UINT32 *base)
{
UINT32 *p_table;
UINT32 description;
UINT32 i;

p_table = base;
description = 0x3000_C00E; //頁(yè)表項的值
*p_table = description;

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

//return;
}



關(guān)鍵詞: ARM內存管理MMU詳

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>