1. 程式人生 > >ARM中MMU工作原理

ARM中MMU工作原理

本文描述基於儲存器管理單元的系統結構, 包含以下內容:
·  關於儲存器管理單元的結構
·  儲存器訪問的順序
·  轉換過程
·  訪問許可權
·  域
·  異常
·  CP15 暫存器
http://embedded.homeunix.org 30/06/2003
Page 3 of 3
3.1 關於儲存器管理單元的結構
MMU 儲存器系統的結構允許對儲存器系統的精細控制。大部分的控制細節由存在存
儲器中的轉換表提供。這些表的入口定義了從1KB 到1MB 的各種儲存器區域的屬
性。這些屬性包括:
虛擬地址到實體地址對映
ARM 處理器產生的地址叫虛擬地址,MMU 允許把這個虛擬地址對映到一個不
同的實體地址去。這個實體地址表示了被訪問的主儲存器的位置。
它允許用很多方式管理物理儲存器的位置,例如:它可以用具有潛在衝突的
地址對映為不同的程序分配儲存器,或允許具有不連續地址的應用把它對映
到連續的地址空間。
------注------
如果使用了快速上下文切換擴充套件(Fast Context Switch Extension),則在
本文中的虛擬地址的意思應該是修改過的虛擬地址(Modified virtual
address)
---------------
儲存器訪問許可權(permissions)
這些控制對儲存器區域的不可訪問許可權、只讀許可權、讀寫許可權。當訪問不可
訪問許可權的儲存器時,會有一個儲存器異常通知ARM 處理器。
允許許可權的級別也受程式執行在使用者狀態還是特權狀態影響,還受是否使用
了域有關。
快取記憶體和緩衝位(Cachability and bufferability bits [C and B])
這些在快取記憶體和緩衝一節講
系統控制協處理器的暫存器允許對系統的高階控制,如轉換表的位置。他們也用來
為ARM 提供記憶體異常的狀態資訊。
查詢整個轉換表的過程叫轉換表遍歷。它由硬體制動進行,並需要大量的執行時間
(至少一個儲存器訪問,通常是兩個)。為了減少儲存器訪問的平均消耗, 轉換表
http://embedded.homeunix.org 30/06/2003
Page 4 of 4
遍歷結果被快取記憶體在一個或多個叫作Translation Lookaside Buffers(TLBs)的
結構中。通常在ARM 的實現中每個記憶體介面有一個TLB。
·  有一個儲存器介面的系統通常有一個唯一的TLB
·  指令和資料的記憶體介面分開的系統通常有分開的指令TLB 和資料TLB
如果系統有快取記憶體, 快取記憶體的數量也通常是由同樣的方法確定的。所以在高
速快取的系統中,每個快取記憶體一個TLB。
當儲存器中的轉換表被改變或選中了不同的轉換表(通過寫CP15 的暫存器2),先
前快取記憶體的轉換表遍歷結果將不再有效。MMU 結構提供了重新整理TLB 的操作。
MMU 結構也允許特定的轉換表遍歷結果被鎖定在一個TLB 中,這就保證了對相關的
儲存器區域的訪問絕不會導致轉換表遍歷,這也對那些把指令和資料鎖定在高速緩
存中的實時程式碼有相同的好處。
3.2 儲存器訪問的順序
當ARM 要訪問儲存器時,MMU 先查詢TLB 中的虛擬地址表,如果ARM 的結構支援分
開的地址TLB 和指令TLB,那麼它用:
·  取指令使用指令TLB
·  其它的所有訪問類別用資料TLB
如果TLB 中沒有虛擬地址的入口,則轉換表遍歷硬體從存在主儲存器中的轉換表中
獲取轉換和訪問許可權,一旦取到,這些資訊將被放在TLB 中,它會放在一個沒有使
用的入口處或覆蓋一個已有的入口。關於轉換表的資訊和轉換表遍歷的實現參見轉
換過程一節。
一旦為儲存器訪問的TLB 的入口被拿到,這些資訊將被用於:
1. C(快取記憶體)和B(緩衝)位被用來控制快取記憶體和寫緩衝,並決定是否高速
快取。(如果系統中沒有快取記憶體和寫緩衝,則對應的位將被忽略)
2. 訪問許可權和域位用來控制訪問是否被允許。如果不允許,則MMU 將向ARM 處理
器傳送一個儲存器異常;否則訪問將被允許進行。
訪問許可權、域和異常幾節有詳細描述。
http://embedded.homeunix.org 30/06/2003
Page 5 of 5
3. 對沒有快取記憶體的系統(包括在沒有快取記憶體系統中的所有儲存器訪問),物
理地址將被用作主儲存器訪問的地址。
對有快取記憶體的系統,在快取記憶體沒有選中的情況下,實體地址將被用行取
(line fetch)的地址。如果選中了快取記憶體,則實體地址將被忽略。
圖3-1 說明了這種快取記憶體系統
訪問控
制硬體
TLB
ARM
處理器
高速緩
存和寫
緩衝
轉換表遍歷
硬體
高速緩
存行取
硬體




虛擬地址
異常
域位
C, B位
實體地址
圖3-1 快取記憶體的MMU儲存器系統
http://embedded.homeunix.org 30/06/2003
Page 6 of 6
3.2.1 允許和禁止MMU
通過寫系統控制協處理器的暫存器1 的第0 位可以允許和禁止MMU。在復位後這位
是0,MMU 被禁止。
當MMU 被禁止時,儲存器訪問將被按如下處理:
1. 由具體的實現確定當MMU 被禁止時是否能夠允許快取記憶體和寫緩衝。
·  當MMU 被禁止時不能允許快取記憶體和寫緩衝時,C 和B 位不起作用。
·  當MMU 被禁止時能允許快取記憶體和寫緩衝時:
i. 訪問資料時被認為沒有快取記憶體和寫緩衝(C==0,B==0)
ii. 取指令時:
a) 當系統只有一個唯一的TLB 時,認為是沒有快取記憶體。(C==0)
b) 當系統只有獨立的指令TLB 時,認為是有快取記憶體。(C==1)
2. 沒有儲存器訪問許可權的檢查,MMU 也不產生異常訊號。
3. 實體地址與虛擬地址相同(即所謂的平坦地址對映模式)。
在允許MMU 之前,必須在記憶體中建立適當的轉換表,並且所有相關的CP15 暫存器
要被初始化正確。
注:-------------------
允許和禁止MMU 直接改變了虛擬地址到實體地址的對映(除非轉換表被設定為平坦
地址對映模式)。所以很可能在允許MMU 時所有的快取記憶體需要被重新整理。
另外,如果允許MMU 的指令的實體地址和虛擬地址不同,取指令將變得複雜化。所
以,強烈建議允許MMU 的指令具有相同的實體地址和虛擬地址。
--------------------------
http://embedded.homeunix.org 30/06/2003
Page 7 of 7
3.3 轉換過程
MMU 支援基於節或頁的儲存器訪問:
節(Section) 構成1MB 的儲存器塊
支援3 中不同的頁尺寸:
微頁(Tiny page) 構成1KB 的儲存器塊
小頁(Small page) 構成4KB 的儲存器塊
大頁(Large page) 構成64KB 的儲存器塊
節和大頁是支援允許只用一個TLB 入口去對映大的儲存器區間。小頁和大頁有附加
的訪問控制:小頁分成1KB 的子頁,和大頁分成16KB 的子頁。微頁沒有子頁,對
微頁的訪問控制是對整個頁。
存在主儲存器內的轉換表有兩個級別:
第一級表 儲存節轉換表和指向第二級表的指標。
第二級表 儲存大頁和小頁的轉換表。一種型別的第二級表儲存微頁轉換表。
MMU 把CPU 產生的虛擬地址轉換成實體地址去訪問外部儲存器,同時繼承並檢查訪
問許可權。地址轉換有四條路徑。路徑的選取由這個地址是被標記成節對映訪問還是
頁對映訪問確定。頁對映訪問可以是大、小和微頁的訪問。
然而,轉換過程總是由下面所描述的那樣由第一級表的獲取開始。節對映的訪問只
需要讀取第一級表,頁對映的訪問還需要讀取第二級表。
3.3.1 轉換表基址
當片上(on-chip)的TLB 中不包含被要求的虛擬地址的入口時,轉換過程被啟
動。轉換表基址暫存器(CP15 的暫存器2)儲存著第一級轉換表基址的實體地址。
只有bits[31:14]有效,bits[13:0]應該是零(SBZ)。所以第一級表必須在16KB
的邊界。
3.3.2 取第一級表
http://embedded.homeunix.org 30/06/2003
Page 8 of 8
轉換表基址暫存器的bits[31:14]與虛擬地址的bits[31:20]和兩個0 位連線形成
32 為實體地址,如圖3-2。這個地址選擇了一個四位元組的轉換表入口,它是第一級
描述符或是指向第二級頁表的指標。
轉換基址 SBZ
轉換基址 表索引 00
31 14 13 0
31 20 19 0
31 14 13 2 10
表索引 xxxxxxxxxxxxxxxxxxxxxx
圖3-2 訪問轉換表的第一級描述符
http://embedded.homeunix.org 30/06/2003
Page 9 of 9
3.3.3 第一級描述符
第一級表的每個入口是一個描述它所關聯的1MB 虛擬地址是如何對映的描述符。見
表3-1,根據bits[1:0]的組合,有四種可能:
·  如果bits[1:0]==0b00,所關聯的地址沒有被對映,試圖訪問他們將產生一
個轉換錯(fault)。因為他們被硬體忽略,所以軟體可以利用這樣的描述
符的bits[31:2]做自己的用途。推薦為描述符繼續保持正確的訪問許可權。
·  如果bits[1:0]==0b10,這個入口是它所關聯地址的節描述符。見節描述符
和轉換節參考中的細節。
·  如果bits[0]==1,這個入口給出粗糙第二級表(bit[1]==0),或精細第二
級表(bit[1]==1)。每一種型別的表描述了它所關聯的1MB 儲存區域的映
射。粗糙第二級表較小,每個表1KB,每個精細第二級表4KB。然而粗糙第
二級表只能對映大頁和小頁,精細第二級表可以對映大頁、小頁和微頁。
3.3.4 節描述符和轉換節參考
如果第一級描述符是節描述符,那麼各個欄位有如下的意義:
Bits[1:0] 描述符型別標識(0b10 表示節描述符)
Bits[3:2] 快取記憶體和緩衝位
Bits[4] 由具體實現定義
Bits[8:5] 這個描述符控制的節的16 種域之一
Bits[9] 現在沒有使用,應該為零
Bits[11:10] 訪問控制,見表3-3
Bits[19:12] 現在沒有使用,應該為零
Bits[31:20] 節基址,形成實體地址的高12 位
忽略 00
粗糙頁表基址 sbz 域 imp 00
節基址 SBZ AP sbz 域 imp C B 10
精細頁表基址 SBZ 域 imp 11
31 20 19 12 11 10 9 8 5 4 3 2 10
表 3-1 第一級描述符格式

粗糙頁表

精細頁表
http://embedded.homeunix.org 30/06/2003
Page 10 of 10
圖3-3 表示了節轉換的完整過程。
注:---------------
訪問許可權必須在實體地址產生之前去檢查,檢查訪問許可權的順序見訪問許可權一節。
---------------------
表索引 節索引
31 20 19 0
虛擬地址
轉換基址 SBZ
31 14 13 0
轉換表基址
轉換基址 表索引 00
31 14 13 2 1 0
第一級表地址
節基址 SBZ AP sbz 域 imp C B 10
31 20 19 12 11 10 9 8 5 4 3 2 1 0
第一級表描述符
節基址 節索引
31 20 19 0
實體地址
圖3-3 節轉換
First-level fetch
http://embedded.homeunix.org 30/06/2003
Page 11 of 11
3.3.5 粗糙頁表描述符
如果第一級描述符是粗糙頁表描述符,那麼各個欄位有如下的意義:
Bits[1:0] 描述符型別標識(0b01 表示粗糙頁表描述符)
Bits[4:2] 由具體實現定義
Bits[8:5] 這個描述符控制的頁的16 種域之一
Bits[9] 現在沒有使用,應該為零
Bits[31:10] 頁表基地址是一個指向第二極粗糙頁表的指標,它給出第二級表訪問
的基地址。而第二級粗糙頁表必須在1KB 邊界對齊。
如果從第一級讀取到的是二級粗糙頁表描述符,那麼會象圖3-4 所示執行第二級描
述符讀取。
第一級表索引 第二級表索引 xxxxx
31 20 19 12 11 0
虛擬地址
轉換基址 SBZ
31 14 13 0
轉換表基址
轉換基址 第一級表索引 0 0
31 14 13 2 1 0
第一級描述符地址
頁表基址 sbz 域 imp 01
31 10 9 8 5 4 2 1 0
第一級描述符
頁表基址 第二級表索引 00
31 10 9 2 1 0
第二級描述符地址
First-level fetch
圖3-4 訪問粗糙頁表第二級描述符
http://embedded.homeunix.org 30/06/2003
Page 12 of 12
3.3.6 精細頁表描述符
如果第一級描述符是精細頁表描述符,那麼各個欄位有如下的意義:
Bits[1:0] 描述符型別標識(0b11 表示精細頁表描述符)
Bits[4:2] 由具體實現定義
Bits[8:5] 這個描述符控制的頁的16 種域之一
Bits[11:9] 現在沒有使用,應該為零
Bits[31:10] 頁表基地址是一個指向第二級精細頁表的指標,它給出第二級表訪問
的基地址。而第二級精細頁表必須在4KB 邊界對齊。
如果從第一級讀取到的是二級精細頁表描述符,那麼會象圖3-5 所示執行第二級描
述符讀取。
第一級表索引 第二級表索引 xxxxx
31 20 19 10 9 0
虛擬地址
轉換基址 SBZ
31 14 13 0
轉換表基址
轉換基址 第一級表索引 0 0
31 14 13 2 1 0
第一級描述符地址
頁表基址 sbz 域 imp 01
31 12 11 9 8 5 4 2 1 0
第一級描述符
頁表基址 第二級表索引 00
31 12 11 2 1 0
第二級描述符地址
First-level fetch
圖3-5 訪問精細頁表第二級描述符
http://embedded.homeunix.org 30/06/2003
Page 13 of 13
3.3.7 第二級描述符
每個粗糙第二級表對映著以4KB 為單位的虛擬地址範圍市怎麼對映的,每個精細第
二級表對映著以1KB 為單位的虛擬地址範圍市怎麼對映的。那些入口是頁描述符,
他們能夠分別描述大於4KB 或1KB 的頁。在這種情況下,這個描述符必須被重複足
夠次,以保證這個頁始終使用相同的描述符,不論訪問這個頁中的哪個虛擬地址。
對於一個第二級描述符,有四種可能,由描述符的bits[1:0]選擇。見表3-2:
·  如果bits[1:0]==0b00,說關聯的虛擬地址沒有被對映,任何對這些虛擬地
址的訪問將會導致轉換錯(fault)。軟體可以利用這樣的描述符的
bits[31:2]做自己的用途,因為他們被硬體忽略。推薦為描述符繼續保持正
確的訪問許可權。
·  如果bits[1:0]==0b01,這個入口是大頁描述符,描述64KB 的虛擬地址。
見轉換大頁參考。
一個大頁描述符在精細第二級表中必須被重複64 次,在粗糙第二級表中必
須被重複16 次以保證所有的虛擬地址都被描述。
·  如果bits[1:0]== 0b10,這個入口是小頁描述符,描述4KB 的虛擬地址。
見轉換小頁參考。
一個小頁描述符在精細第二級表中必須被重複4 次,以保證所有的虛擬地址
都被描述。在粗糙第二級表中只有一個例項。
·  如果bits[1:0]== 0b11,這個入口是微頁描述符,描述1KB 的虛擬地址。
見轉換微頁參考。
在精細第二級表中只需要一個微頁描述符的例項。微頁描述符不能在粗糙第
二級表中出現,如果出現了,結果不可預測。
忽略 00
大頁基地址 SBZ AP3 AP2 AP1 AP0 C B 01
小頁基地址 AP3 AP2 AP1 AP0 C B 01
微頁基地址 SBZ AP C B 11
表3-2 第二級描述符格式
31 16 15 12 11 10 9 8 7 6 5 4 3 2 1 0

大頁
小頁
微頁
http://embedded.homeunix.org 30/06/2003
Page 14 of 14
大頁描述符欄位
大頁描述符的欄位有如下意義:
bits[1:0] 表示描述符的型別
bits[3:2] 高速緩促和緩衝位
bits[11:4] 訪問許可權位。這些為控制對頁的訪問。關於這些位的解釋見表3-3。
大頁被分成4 各子頁。
AP0 編碼對第一個子頁的訪問許可權。
AP1 編碼對第二個子頁的訪問許可權。
AP2 編碼對第三個子頁的訪問許可權。
AP3 編碼對第四個子頁的訪問許可權。
bits[15:12] 現在沒有使用,應該為零。
bits[31:16] 用來形成實體地址的對應位。
小頁描述符欄位
小頁描述符的欄位有如下意義:
bits[1:0] 表示描述符的型別
bits[3:2] 高速緩促和緩衝位
bits[11:4] 訪問許可權位。這些為控制對頁的訪問。關於這些位的解釋見表3-3。
小頁被分成4 各子頁。
AP0 編碼對第一個子頁的訪問許可權。
AP1 編碼對第二個子頁的訪問許可權。
AP2 編碼對第三個子頁的訪問許可權。
AP3 編碼對第四個子頁的訪問許可權。
bits[31:12] 用來形成實體地址的對應位。
微頁描述符欄位
微頁描述符的欄位有如下意義:
bits[1:0] 表示描述符的型別
bits[3:2] 高速緩促和緩衝位
bits[5:4] 訪問許可權位。這些為控制對頁的訪問。關於這些位的解釋見表3-3 關
於微頁的解釋。
bits[9:6] 現在沒有使用,應該為零。
bits[31:10] 用來形成實體地址的對應位。
http://embedded.homeunix.org 30/06/2003
Page 15 of 15
3.3.8 轉換大頁參考
圖3-6 顯示了在粗糙第二級表中轉換一個64KB 的大頁的完整順序。在精細第二級
表中的轉換順序頁相似,只是第二級描述符的地址如精細頁表描述符一節所決定。
注:-----------------------------
頁索引的高4 位和第二級表的低階4 位重疊,在粗糙頁表中大頁的每個頁表入口必
須被重複16 次。在精細頁表中大頁的每個頁表入口必須被重複64 次。
-----------------------------------
大頁基址 頁索引
31 16 15 0
實體地址
大頁基址 SBZ AP3 AP2 AP1 AP0 C B 0 1
31 16 15 121110 9 8 7 6 5 4 3 2 10
0
第二級描述符
頁表基址 第二級表索引 00
31 10 9 2 10
第二級描述符地址
頁表基址 sbz 域 imp 01
31 10 9 8 5 4 2 10
第一級描述符
轉換基址 第一級表索引00
31 14 13 2 10
第一級描述符地址
轉換基址 SBZ
31 14 13 2 10
轉換表基址
第一級表索引 第二級表索引 頁索引
31 20 19 16 15 12 11 0
虛擬地址
Second-level fetch
First-level fetch
圖3-6 粗糙第二級表中的大頁轉換
http://embedded.homeunix.org 30/06/2003
Page 16 of 16
3.3.9 轉換小頁參考
圖3-7 顯示了在粗糙第二級表中轉換一個4KB 的小頁的完整順序。在精細第二級表
中的轉換順序頁相似,只是第二級描述符的地址如精細頁表描述符一節所決定。
注:-----------------------------
當小頁出現在精細第二級表中時,頁索引的高2 位和第二級表的低階2 位重疊,在
精細頁表中小頁的每個頁表入口必須被重複4 次。
-----------------------------------
圖3-7 粗糙第二級表中的小頁轉換
小頁基址 頁索引
31 12 11 0
實體地址
小頁基址 AP3 AP2 AP1 AP0 C B 10
31 12 11 10 9 8 7 6 5 4 3 2 10
0
第二級描述符
頁表基址 第二級表索引00
31 10 9 2 10
第二級描述符地址
頁表基址 sbz 域 imp 01
31 10 9 8 5 4 2 10
第一級描述符
轉換基址 第一級表索引 00
31 14 13 2 10
第一級描述符地址
第一級表索引 第二級表索引 頁索引
31 20 19 12 11 0
虛擬地址
轉換基址 SBZ
31 14 13 0
轉換表基址
First-level fetch
Second-level fetch
http://embedded.homeunix.org 30/06/2003
Page 17 of 17
3.3.10 轉換微頁索引
圖3-8 顯示了在精細第二級表中轉換1KB 微頁的完整過程。
注:---------------------------
微頁不能出現在粗糙第二級表中。
---------------------------------
轉換基址 SBZ
31 14 13 0
轉換表基址
第一級表索引 第二級表索引 頁索引
31 20 19 10 9 0
虛擬地址
轉換基址 第一級表索引 00
31 14 13 2 10
第一級描述符地址
頁表基址 sbz 域 imp11
31 12 11 9 8 5 4 2 10
第一級描述符
微頁表基址 SBZ AP C B 11
31 10 9 6 5 4 3 2 10
第二級描述符
頁表基址 第二級表索引00
31 12 11 2 10
第二級描述符地址
微頁表基址 頁索引
31 10 9 0
實體地址
Second-level fetch
First-level fetch
圖3-8 精細第二級表中的微頁轉換
http://embedded.homeunix.org 30/06/2003
Page 18 of 18
3.4 訪問許可權
在節和頁描述符中的訪問許可權位控制對相應的節和頁的訪問。訪問許可權由CP15 的
暫存器1 的System(S)和ROM(R)位修改。表3-3 描述了訪問許可權位和S、R 位相互
作用時的意義。如果訪問了沒有訪問許可權的儲存器空間,將會產生許可權錯(見異常
一節)。
表3-3 MMU 訪問許可權
AP
S
R
Privileged permissions
User permissions
0b00 0 0 不能訪問 不能訪問
0b00 1 0 只讀 不能訪問
0b00 0 1 只讀 只讀
0b00 1 1 不可預測 不可預測
0b01 X X 讀/寫 不能訪問
0b10 X X 讀/寫 只讀
0b11 X X 讀/寫 讀/寫
http://embedded.homeunix.org 30/06/2003
Page 19 of 19
3.5 域
域是節、大頁和小頁的集合。ARM 結構支援16 個域。對域的訪問由域訪問控制寄
存器的兩個位欄位控制。因為每個欄位對訪問對應的域的使能非常迅速,所以整個
儲存器區間能很快地交換進出虛擬儲存器。這裡支援2 種域訪問方式:
客戶 域的使用者(執行程式,訪問資料),被形成這個域的節或頁來監督訪
問許可權。
管理者 控制域的行為(域中的當前節和頁,對域的訪問),不被形成這個域
的節或頁來監督訪問許可權。
一個程式可以是一些域的客戶,也是另外一些域的管理者,同時沒有對其它域的訪
問許可權。這允許對程式訪問不同儲存器資源的非常靈活的儲存器保護。表3-4 說明
了域訪問控制暫存器的位編碼方式。
表3-4 域訪問的值

訪問方式
描述
0b00 不能訪問 任何訪問都將導致一個域錯(domain fault)
0b01 客戶 能否訪問將根據節或頁描述符中的訪問許可權位
確定
0b10 保留 使用這個值將導致不可預料的結果
0b11 管理者 不根據節或頁描述符中的訪問許可權位確定能否
訪問,所以不會產生許可權錯。(permission
fault)
http://embedded.homeunix.org 30/06/2003
Page 20 of 20
3.6 異常
由於儲存器訪問的約束而導致ARM 處理器停止執行的機制有:
MMU fault MMU 檢測到約束並統治處理器
外部Abort 外部儲存器系統發出一個非法儲存器訪問訊號
MMU fault 和 外部Abort 都叫異常(ABORT)。
如果導致異常的儲存器操作是取指令,那麼當處理器去執行這個非法訪問得到的指
令時產生一個預取指令異常。如果導致異常的儲存器操作是存取資料,那麼產生一
個數據異常。參見2.6 節。
3.6.1 MMU fault
MMU 產生4 種類型的fault
·  對齊錯
·  轉換錯
·  域錯
·  許可權錯
儲存器系統能終止3 種類型的訪問
·  line fetch
·  儲存器訪問(沒有快取記憶體和沒有緩衝的訪問)
·  轉換表訪問
MMU 檢測到的異常在任何外部儲存器訪問發生之前被停止。終止導致外部異常的外
部訪問是外部系統的職責。
系統控制協處理器有2 個暫存器,當外部訪問被終止時更新。指令預取異常不更新
這些暫存器,由於程式流程的改變,產生遺產的指令沒有被執行。
錯誤地址暫存器(FAR)和錯誤狀態暫存器(FSR)
資料異常會被CPU 立即響應。FSR 被一個4 位的錯誤狀態(FS[3:0])和域序號更
新。虛擬地址被寫入FAR。如果資料訪問連續地產生多個數據異常,則它們的優先
級由表3-5 決定。
由取指令產生的異常在指令進入指令流水線時被標記。只有當指令執行時產生預取
異常。一個異常導致取指令沒有被執行如果那條指令不被使用(例如跳轉到別處)
http://embedded.homeunix.org 30/06/2003
Page 21 of 21
通常當進入預取指令異常服務程式時,fault 所關聯的地址被放在R14_abt 暫存器
中。由具體實現決定當預取指令異常產生時是否更新FSR 和FAR。但是預取指令異
常在資料異常產生時(更新FAR 和FSR)和進入資料異常項量入口時絕不更新FSR
和FAR。也就是說資料異常可以使用FAR 和FSR 的值,它們不會被預取指令異常給
破壞。
表3-5 fault 狀態的優先順序編碼
優先

源 FSR[3:0] Domain[3:0] FAR
最高 Terminal Exception 0b0010 Invalid Implementation
Defined
Vector Exception 0b0000 Invalid Valid
Alignment 0b00x1 Invalid Valid
External Abort
Translation: 1st level
2nd level
0b1100
0b1110
Invalid
Valid
Valid
Valid
Translation:
Section
Page
0b0101
0b0111
Invalid
Valid
Valid
Valid
Domain:
Section
Page
Ob1001
0b1011
Valid
Valid
Valid
Valid
Permission:
Section
Page
Ob1101
Ob1111
Valid
Valid
Valid
Valid
External Abort on
Linefetch:
Section
Page
0b0100
0b0110
Valid
Valid
Valid
Valid
最低 External Abort on
Non_lineFetch:
Section
Page
0b1000
0b1010
Valid
Valid
Valid
Valid
---注--------
Alignment 能寫0b0001 或0b0011 到FSR[3:0]。
在域(Domain[3:0])中的非法值是因為fault 發生在有效的域被裝入之前。
任何被優先順序編碼遮蔽的異常能夠由修改原來的異常(by fixing the primary
abort) 並重新執行那條指令產生。
http://embedded.homeunix.org 30/06/2003
Page 22 of 22
Vector Exception 打破了FS[0]=0 標緻著外部異常的模式。
--------------------
錯誤檢測順序(Fault-checking sequence)
MMU 檢測訪問錯對節(Section)和頁(Page)有些不同,見圖3-9
Virtual address
Checking
Alignment?
Check address alignment
Misaligned?
Alignmrnt fault
Get 1st level descriptor
External Abort
Descriptor fault
Section or Page?
Translation
External
abort
Section
Translation
fault
Y
N
N
N
N
Y
Y
Y
Secti
on
Page
Section
Page
http://embedded.homeunix.org 30/06/2003
Page 23 of 23
Section
Check Domain
Access Type
Section
Domain
fault
Section
Permission
fault
Client access permissions
Violation?
Physical address
No access
Client
Y
N
Manager
http://embedded.homeunix.org 30/06/2003
Page 24 of 24
Page
Get 2nd descriptor
External
abort
Invalid
Descriptor?
Check domain
Access
type
Check access permissions
Violation?
Physical address
Translation
External
abort
Page
Translation
fault
Page
Domain
fault
Sub-page
Permission
fault
Y
Y
No access
Y
N
N
N
client
Manager
圖3-9 錯位檢查順序
http://embedded.homeunix.org 30/06/2003
Page 25 of 25
Terminal exception 終端錯
這標誌著發生一個不可挽回的錯誤。這在(如果至少)是具體實現決定的情況下發
生。
Vector exception 向量錯
當處理器是32 位配置(PROG32 被啟用),在26 位模式(CPSR[4]==0),資料訪
問(不是取指令)通常的向量表(地址0x00-0x1F)導致一個數據異常,這叫向量
錯。如果向量錯發生在MMU 被禁止時,由具體實現決定如何實現。詳細資訊見A8-
11 頁。
Alignment fault 對齊錯
如果對齊錯被允許,則當訪問一個不在字對齊地址的資料字(虛擬地址位
bits[1:0]!=0b00)或訪問一個不在半字對齊地址的資料半字(虛擬地址位
bits[0]!=0)時產生對齊錯。取指令和位元組訪問不產生對齊錯。
---注-----
如果產生對齊錯,訪問將被終止,而不去進行許可權檢查。如果對齊錯發生在MMU 被
禁止時,由具體實現決定如何實現。
----------
Translation fault 轉換錯
有兩類轉換錯:
節 當第一級描述符被標誌為無效時產生。這時候描述符的bits[1:0]==0b00。
頁 當第二級描述符被標誌為無效時產生。這時候描述符的bits[1:0]==0b00。
Domain fault 域錯
有兩類域錯:
·  節
·  頁
在這兩種情況下,第一級描述符中有4 位域欄位用來選擇16 個域中的一個。域由
域訪問控制暫存器中的2 個位控制,這2 個位用來檢查訪問許可權。見表3-4。
如果是節,域訪問的檢查在第一級描述符返回時進行。
如果是頁,域訪問的檢查在第二級描述符返回時進行。
如果特定的訪問在域訪問控制暫存器中被標識為不可訪問,則回產生一個節域錯
或頁域錯。
http://embedded.homeunix.org 30/06/2003
Page 26 of 26
Permission fault 許可權錯
有節許可權錯和子頁許可權錯。
許可權錯與域錯的檢查同時進行。如果那2 位的域欄位返回的是客戶(client)(01),
許可權檢查如下進行:
節 如果第一級描述符定義了一個節訪問,那麼描述符的AP 位定義了訪問是否
允許,見表3-3。如果訪問不允許,那將產生節許可權錯。
子頁 如果第一級描述符定義了一個頁對映的訪問,那麼第二級描述符可以定義一
個微頁,小頁或大頁。如果第二級描述符定義了一個微頁,那它只有一個
AP 位,這個位適用於整個頁。否則第二級描述符有4 個AP 位(AP3、AP2、
AP1 和AP0),每一個對應1/4 頁。
小頁:AP3 選擇頂上的1KB,AP0 選擇底下的1KB。大頁:AP3 選擇頂上的
16KB,AP0 選擇底下的16KB。被選擇的AP 位與節完全一樣地解釋,(見表
3-3),只是產生的是子頁錯。
3.6.2 外部異常
除了MMU 錯,ARM 結構還定義了一個外部異常管腳,可以用來標識訪問外部儲存器
錯誤。然而不是所有的訪問都能用這種方式終止,所以這個腳必須被仔細使用。以
下的訪問可以被外部終止並安全地重啟動:
·  讀
·  無緩衝的寫
·  取第一級描述符
·  取第二級描述符
·  在沒有快取記憶體和沒有緩衝的儲存器區域的訊號(Semaphore)
行取能夠在行傳送的任何一個字上安全地終止。如果異常發生在處理器請求的資料
上(而不是在cache line 上取的其它資料),訪問被終止。任何不是立刻訪問的
資料傳送(在cache line 上取的其它資料),只在訪問它們時產生異常。
由具體實現確定FAR 暫存器是指向cache line 的起始地址還是包含產生遺產的地
址。
緩衝的寫不能被外部終止。所以系統必須配置成不向能夠標識外部異常的儲存器區
域進行緩衝的寫,或者用不同的機制去標誌異常(例如中斷)。
產生異常後,那個儲存器空間的值是不確定的。
http://embedded.homeunix.org 30/06/2003
Page 27 of 27
3.7 CP15 暫存器
MMU 由系統控制暫存器的2、3、4、5、6、8、10 號暫存器和1 號暫存器的一些位
控制。
3.7.1 暫存器1 的MMU 控制位
暫存器1 的如下這些位用來控制MMU:
M(bit[0]) 使能MMU
0 = 禁止MMU
1 = 允許MMU
在沒有MMU 和保護單元的系統上,這個位應該讀出為0,並忽略寫。
A(bit[1]) 使能對齊錯檢查
0 = 禁止
1 = 允許
S(bit[8]) 這是系統保護位,見3-4 節。
R(bit[9]) 這是ROM 保護位,見3-4 節。
3.7.2 暫存器2:轉換表基地址
讀CP15 暫存器2 時,在bits[31:14]返回當前活動的第一級轉換表的實體地址,
bits[13:0]不確定。讀CP15 暫存器2 時,CRm 和運算元2 被忽略,並應該是0。
寫CP15 暫存器2 時,在bits[31:14]更新當前活動的第一級轉換表的實體地址,
bits[13:0]應該寫0 或先前讀回的值。寫CP15 暫存器2 時,CRm 和運算元2 被忽
略,並應該是0。
3.7.3 暫存器3:域訪問控制
讀CP15 暫存器3 時,返回域訪問控制暫存器的值。CRm 和運算元2 被忽略,並應
該是0。
寫CP15 暫存器3 時,更新域訪問控制暫存器的值。CRm 和運算元2 被忽略,並應
該是0。
31 14 13 0
轉換表基地址 UNP/SBZP
31 30 29 2 1 0
D15 …… D0
http://embedded.homeunix.org 30/06/2003
Page 28 of 28
域訪問控制暫存器包含16 個2 位的欄位,它定義了對應域的訪問許可權。見3-5
節。
3.7.4 暫存器4:保留
讀寫CP15 暫存器4 不可預料結果。
3.7.5 暫存器5:錯誤狀態 FSR
讀CP15 暫存器5 時,返回FSR 暫存器的值。FSR 包含最近一次資料錯的資訊。只
有低9 位有效,高23 位不確定。FSR 指出異常發生時的域和試圖訪問的型別。
bit[8] 返回0
bit[7:4] 指出錯位發生時訪問的域
bit[3:0] 試圖訪問的型別,這些位的編碼見表3-5
FSR 在資料錯時更新。由具體實現確定取指令異常是否更新FSR。見3.6.1 節的
“錯誤地址暫存器(FAR)和錯誤狀態暫存器(FSR)”。CRm 和運算元2 被忽略,並應
該是0。
寫FSR 將把FSR 設定成寫的值。這對於程式偵錯程式非常有用,可以用來恢復FSR 的
值。高24 位應該寫0 或上次讀到的值。CRm 和運算元2 被忽略,並應該是0。
3.7.6 暫存器6:錯誤地址 FAR
讀CP15 暫存器6 返回FAR 的值。FAR 儲存著錯誤產生時訪問的虛擬地址。在資料
錯時更新FAR。由具體實現確定取指令異常是否更新FSR。見3.6.1 節的“錯誤地
址暫存器(FAR)和錯誤狀態暫存器(FSR)”。CRm 和運算元2 被忽略,並應該是0。
寫FSR 將把FAR 設定成寫的值。這對於程式偵錯程式非常有用,可以用來恢復FAR 的
值。高24 位應該寫0 或上次讀到的值。CRm 和運算元2 被忽略,並應該是0。
---注------
31 9 8 7 4 3 0
UNP/SBZP 0 Domain Status
31 0
錯誤地址
http://embedded.homeunix.org 30/06/2003
Page 29 of 29
如果使用了第六章描述的快速上下文切換擴充套件(FCSE),那麼:
·  當儲存器錯更新FAR 時,寫入FAR 的是修改的虛擬地址。
·  當用MRC 指令讀或用MCR 指令寫FAR 時,它的值被當作資料對待,所以沒有
由FCSE 產生的地址修改。
------------
3.7.7 暫存器8:TLB 功能
當CP15 的暫存器8 用來控制TLB 時是隻讀暫存器。表3-6 顯示了定義的TLB 功能
和在MCR 指令中用的CRm 和第二個朝運算元<opcode2>的值。使用沒有在表中的
CRm 和opcode2 的組合將導致不可預料的結果。
如果下面的任何操作被用在單一TLB 的實現中,則在單一TLB 中實現相同的功能:
·  無效的指令TLB (Invalidate instruction TLB)
·  無效的指令單一入口 (Invalidate instruction single entry)
·  無效的整個資料TLB (Invalidate entire data TLB)
·  無效的資料單一入口 (Invalidate data single entry)
否則,如果執行一個與特定實現不相關的功能,會導致不確定的結果。
試圖用MRC 指令讀CP15 暫存器8 的結果不確定。
當只有很少量的儲存器被重新對映時,無效的單一入口操作能被用來在一些實現中
改善效能。對每個被重新對映的儲存器區域(節、小頁或大頁),無效的單一入口
需要在儲存器區域的虛擬地址上執行。效能的改善來源於不用重新裝載與沒有被重
新對映的儲存器區域相關的TLB 入口。
---注------
無效的單一入口操作的效能改善並不被保證。具體實現可以是單一請求入口無效,
直到使整個TLB 無效。
-----------
---小心------
當儲存器被重新對映時必須使與舊的對映相關的TLB 入口無效。如果不這樣,可能
會進入兩個TLB 入口覆蓋虛擬地址範圍的狀態。在最好的情況下訪問這樣的覆蓋虛
擬地址範圍會有不可預料的結果;在某些實現中甚至會物理損壞MMU。
強烈建議在重新對映儲存器時要加倍小心使TLB 適當地失效。
------------
http://embedded.homeunix.org 30/06/2003
Page 30 of 30
---注------
如果使用了第六章描述的快速上下文切換擴充套件(FCSE),那麼表3-6 中的一些功
能傳遞給CP15 的虛擬地址被當作資料。這意味著對它們來說沒有由FCSE 產生
的地址修改。
------------
3.7.8 暫存器10:TLB 鎖定
轉換表遍歷的執行需要一定的時間,特別當訪問慢速的主儲存器時。在實時中斷處
理程式中,當TLB 不包含中斷處理程式的轉換和/或要訪問的資料時,中斷延遲迴
大量加長。
TLB 鎖定是一些ARM 儲存器系統的特性,它允許把特定的轉換表遍歷的結果裝載到
TLB 中。這種方式不會被後來的轉換表遍歷的結果覆蓋。由CP15 暫存器10 設定。
設 W=LOG2(TLB 入口數),如果需要的話取整(round-up),則CP15 暫存器10 的格
式為:
如果具體的實現有分開的指令和資料TLB,那麼有2 個不同的暫存器,由訪問寄存
器10 的MCR 或MRC 指令中的opcode2 欄位選擇:
opcode2 == 0 選擇資料TLB 鎖定暫存器
opcode2 == 1 選擇指令TLB 鎖定暫存器
功能 Opcode2 CRm Data 指令
無效整個唯一的TLB 或
指令和資料TLB
0b000 0b0111 SBZ MCR p15,0,Rd,c8,c7,0
無效唯一的單一入口
0b001
0b0111
Virtual
address
MCR p15,0,Rd,c8,c7,1
無效整個指令TLB 0b000
0b0101
SBZ
MCR p15,0,Rd,c8,c5,0
無效指令單一入口
0b001
0b0101
Virtual
address
MCR p15,0,Rd,c8,c5,1
無效整個資料TLB
0b000
0b0110
SBZ
MCR p15,0,Rd,c8,c6,0
無效資料單一入口 0b001 0b0110 Virtual
address
MCR p15,0,Rd,c8,c6,1
表3-6 TLB 功能
31 32-W 31-W 32-2W 31-2W 1 0
base victim UNP/SBZP P
http://embedded.homeunix.org 30/06/2003
Page 31 of 31
如果具體的實現只有唯一的TLB,那麼只有1 個暫存器,opcode2 欄位應該為0。
訪問暫存器10 的MCR 或MRC 指令中的CRm 總應該為0。
寫暫存器10 有如下結果:
victim 欄位表示下次TLB 失敗(miss)時,轉換表遍歷的結果替代哪個TLB 入口。
Base 欄位包含TLB 替換的策略,只使用從(base)到(TLB 入口-1)的TLB 入口,
victim 應該在這個區間。
轉換表遍歷的結果在寫到TLB 入口時,若P==1 則它被保護起來,不能被暫存器8
的使整個TLB 失效操作影響;若P==0 則會被那些操作給失效掉。
---注------
如果TLB 的入口不是2 的N 次方,那麼寫到大於或等於TLB 入口數的TLB 入口的
base 或victim 的值將不確定。
-----------
讀暫存器10 將返回它的值。
TLB 鎖定過程
通常鎖定N 個TLB 入口的過程如下:
1. 禁止中斷等,來保證當這個過程執行時不會產生異常
2. 如果一個指令TLB 或唯一TLB 被鎖定,用base==N、index==N 和P==0 寫到適當
版本的暫存器10。如果可能,把另指令預取很難理解的分枝預測功能關掉。
3. 使要被鎖定的整個TLB 失效。
4. 如果是指令TLB 鎖定,要確保剩下的鎖定過程所要預取的指令相關的TLB 入口
都被裝載。(要注意鎖定是從哪裡開始的,通常可能一個TLB 入口包含所有這
些。這時TLB 被失效後的第一條指令能完成這個功能)
如果是資料TLB 鎖定,要確保剩下的鎖定過程所要訪問資料的相關的TLB 入口
都被裝載。這包含被程式碼用到的嵌入文字(inline literals)(通常最好避免在
鎖定過程中使用嵌入文字,並把所有的資料放在由一個TLB 入口所包含的區
域,然後從那裡載入一個數據)
如果一個唯一TLB 被鎖定,執行以上所有的過程。
5. i 從0 到N-1 迴圈
http://embedded.homeunix.org 30/06/2003
Page 32 of 32
a. 用base==i、index==i 和P==1 寫到暫存器10。
b. 強迫被鎖定到TLB 入口i 處的轉換表遍歷結果的儲存器區域發生轉換
表遍歷:
* 如果是資料TLB 或唯一TLB 被鎖定,從那個區域載入一個數據
* 如果是指令TLB 被鎖定,用B5-15 頁所描述的指令預取高速緩衝寄
存器7 來在那個區域產生指令預取。
6. 用base==N、index==N 和P==0 寫到暫存器10。
---注------
如果你使用FCSE,要注意第5b 步,因為:
·  如果是資料TLB 鎖定或唯一TLB 鎖定,載入資料指令的地址是會被FCSE 修改
的。
·  如果是指令TLB 鎖定,用在暫存器7 的地址被當作資料,所以不會被FCSE 修
改。
為了減少混淆,建議鎖定過程應該是:
·  從禁止FCSE 開始(設定PID 為0)
·  把適當的PID 值OR 到使用的虛擬地址的高7 位來自己產生修改的虛擬地址。
-----------
TLB 解鎖過程
用上面的過程解鎖被鎖定的TLB 部分:
1. 用暫存器8 的操作使每個被鎖定的單一入口失效
2. 用base==0、index==0 和P==0 寫到暫存器10。
---注------
第一步是為了保證P==1 的入口在TLB 中不在被剩下。如故它們被剩在TLB 中,後
續的TLB 鎖定過程中使整個TLB 失效(第三步)將不會有預期的結果。
-----------