概述:在基於ARM的嵌入式應用系統中,存儲系統的操作通常是由協處理器CP15完成的。CP15包含16個32位的寄存器,其編號為0~15。
而訪問CP15寄存器的指令主要是MCR和MRC這兩個指令。
例如協處理器15(CP15),ARM處理器使用協處理器15的寄存器來控制cache、TCM和存儲器管理。
而訪問CP15寄存器的指令主要是MCR和MRC這兩個指令:
MRC:協處理器寄存器到ARM處理器寄存器的數據傳送指令(讀出協處理器寄存器)。
MCR:ARM處理器寄存器到協處理器寄存器的數據傳送指令(寫入協處理器寄存器)。
1.MRC/MCR指令讀取CP15寄存器格式:
MRC{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
MCR{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
cond:為指令執行的條件碼。當cond忽略時指令為無條件執行。
Opcode_1:協處理器的特定操作碼. 對於CP15寄存器來說,opcode1=0
Rd:作為源寄存器的ARM寄存器,其值將被傳送到協處理器寄存器中,或者將協處理器寄存器的值傳送到該寄存器里面 ,通常為R0
CRn:作為目標寄存器的協處理器寄存器,其編號是C~C15。
CRm:協處理器中附加的目標寄存器或源操作數寄存器。如果不需要設置附加信息,將CRm設置為c0,否則結果未知
Opcode_2:可選的協處理器特定操作碼。(用來區分同一個編號的不同物理寄存器,當不需要提供附加信息時,指定為0)
1.1 示例:
mrc p15, 0, r0, c1, c0, 0 //將 CP15 的寄存器 C1 的值讀到 r0 中
mcr p15, 0, r0, c7, c7, 0 //關閉ICaches和DCaches
mcr p15, 0, r0, c8, c7, 0 //使無效整個數據TLB和指令TLB
1.2 在C函數中使用匯編示例:
__asm__( "mrc p15, 0, r1, c1, c0, 0\n" //使用__asm__ 可以在C函數中執行匯編語句
"orr r1, r1, #0xc0000000\n"
"mcr p15, 0, r1, c1, c0, 0\n"
:::"r1" //:::"r1" 向GCC聲明:我對r1作了改動
);
2.CP15中的寄存器介紹
CP15 的寄存器列表如表所示:
寄存器編號 |
基本作用 |
在 MMU 中的作用 |
在 PU 中的作用 |
0 |
ID 編碼(只讀) |
ID 編碼和 cache 類型 |
|
1 |
控制位(可讀寫) |
各種控制位 |
|
2 |
存儲保護和控制 |
地址轉換表基地址 |
Cachability 的控制位 |
3 |
存儲保護和控制 |
域訪問控制位 |
Bufferablity 控制位 |
4 |
存儲保護和控制 |
保留 |
保留 |
5 |
存儲保護和控制 |
內存失效狀態 |
訪問權限控制位 |
6 |
存儲保護和控制 |
內存失效地址 |
保護區域控制 |
7 |
高速緩存和寫緩存 |
高速緩存和寫緩存控制 |
|
8 |
存儲保護和控制 |
TLB 控制 |
保留 |
9 |
高速緩存和寫緩存 |
高速緩存鎖定 |
|
10 |
存儲保護和控制 |
TLB 鎖定 |
保留 |
11 |
保留 |
|
|
12 |
保留 |
|
|
13 |
進程標識符 |
進程標識符 |
|
14 |
保留 |
|
|
15 |
因不同設計而異 |
因不同設計而異 |
因不同設計而異
|
2.1 CP15 的寄存器 C0
CP15 中寄存器 C0 對應兩個標識符寄存器,由訪問 CP15 的寄存器指令指定要訪問哪個具體物理寄存器,與兩個標識符寄存器的對應關系如下所示:
opcode2 編碼 |
對應的標識符號寄存器 |
0b000 |
主標識符寄存器 |
0b001 |
cache類型標識符寄存器 |
其 他 |
保留 |
1、主標識符寄存器
指令格式:MRC P15,0,R0,C0,C0,0 #將主標示符寄存器的內容讀到AMR寄存器R0中
主標示符的編碼格式對於不同的ARM處理器版本有所不同。對於AMR7之后的處理器,其主標示符編碼格式如下 :
30~24 |
23~20 |
19~16 |
15~4 |
3~0 |
由生產商確定 |
產品子編號 |
ARM 體系版本號 |
產品主編號 |
處理器版本號 |
各部分的編碼詳細含義如下表所示:
2、cache類型標識符寄存器
指令格式:MRC P15,0,R0,C0,C0,1 #將cache類型標識符寄存器的內容讀到AMR寄存器R0中
ARM 處理器中 cache 類型標識符寄存器的編碼格式如下所示:
31~29 |
28~25 |
24 |
23~12 |
11~0 |
000 |
屬性字段 |
S |
數據 cache 相關屬性 |
指令cache 相關屬性 |
各部分的編碼詳細含義如下表所示:
位 |
含義 |
位[28: 25] |
主要用於定義對於寫回類型的cache的一些屬性 |
位[24] |
定義系統中的數據 cache 和指令 cache 是分開的還是統一的: |
位 [23: 12] |
定義數據 cache 的相關屬性,如果位 [24] 為 0 ,本字段定義整個cache 的屬性 |
位 [31: 24] |
定義指令 cache 的相關屬性,如果位 [24] 為 0 ,本字段定義整個cache 的屬性 |
控制字段位 [28 : 25] 的含義
主要用於定義對於寫回類型的cache的一些屬性,cache 類型標識符寄存器的控制字段位 [28 : 25]:
編 碼 |
cache 類型 |
cache 內容清除方法 |
cache 內容鎖定方法 |
0b0000 |
寫通類型 |
不需要內容清除 |
不支持內容鎖定 |
0b0001 |
寫回類型 |
數據塊讀取 |
不支持內容鎖定 |
0b0010 |
寫回類型 |
由寄存器 C7 定義 |
不支持內容鎖定 |
0b0110 |
寫回類型 |
由寄存器 C7 定義 |
支持格式 A |
0b0111 |
寫回類型 |
由寄存器 C7 定義 |
支持格式 B |
控制字段位 [23 : 12] 及控制字段位 [11 : 0] 含義
[23:12]用於定義數據cache的屬性,[11: 0]用於定義指令cache的屬性。編碼格式如下:
11~9 |
8~6 |
5~3 |
2 |
1~0 |
000 |
cache 容量 |
cache 相聯特性 |
M |
塊大小 |
其中bits[1:0]含義如下:
編 碼 |
cache 塊大小 |
0b00 |
2 個 字( 8 字節) |
0b01 |
4 個 字( 16 字節) |
0b10 |
8 個 字( 32 字節) |
0b11 |
16 個 字( 64 字節) |
其中bits[5:3]含義如下:
編 碼 |
M=0 時含義 |
M=1 時含義 |
0b000 |
1 路 相聯(直接映射) |
沒有 cache |
0b001 |
2 路 相聯 |
3 路 相聯 |
0b010 |
4 路 相聯 |
6 路 相聯 |
0b011 |
8 路 相聯 |
12 路 相聯 |
0b100 |
16 路 相聯 |
24 路 相聯 |
0b101 |
32 路 相聯 |
48 路 相聯 |
0b110 |
64 路 相聯 |
96 路 相聯 |
0b111 |
128 路相聯 |
192 路相聯 |
其中bits[8:6]含義如下:
編 碼 |
M=0 時含義 |
M=1時含義 |
0b000 |
0.5KB |
0.75 KB |
0b001 |
1 KB |
1.5 KB |
0b010 |
2 KB |
3 KB |
0b011 |
4 KB |
6 KB |
0b100 |
8 KB |
12 KB |
0b101 |
16 KB |
24 KB |
0b110 |
32 KB |
48 KB |
0b111 |
64 KB |
96 KB |
2.2 CP15 的寄存器 C1
CP15中的寄存器C1是一個控制寄存器,它包括以下控制功能:
- 禁止或使能MMU以及其他與存儲系統相關的功能
- 配置存儲系統以及ARM處理器中的相關部分的工作
指令如下:
mrc p15, 0, r0, c1, c0{, 0} ;將 CP15 的寄存器 C1 的值讀到 r0 中
mcr p15, 0, r0, c1, c0{, 0} ;將 r0 的值寫到 CP15 的寄存器 C1 中
CP15 中的寄存器 C1 的編碼格式及含義說明如下:
C1中的控制位 |
含義 |
M(bit[0]) |
0 :禁止 MMU 或者 PU |
A(bit[1]) |
0 :禁止地址對齊檢查 |
C(bit[2]) |
當數據cache和指令cache分開時,本控制位禁止/使能數據cache。當數據cache和指令cache統一時,該控制位禁止/使能整個cache。 |
W(bit[3]) |
0 :禁止寫緩沖 |
P(bit[4]) |
對於向前兼容26位地址的ARM處理器,本控制位控制PROG32控制信號 |
D(bit[5]) |
對於向前兼容26位地址的ARM處理器,本控制位控制DATA32控制信號 |
L(bit[6]) |
對於ARMv3及以前的版本,本控制位可以控制處理器的中止模型 |
B(bit[7]) |
對於存儲系統同時支持big-endian和little-endian的ARM系統,本控制位配置系統的存儲模式 |
S(bit[8]) |
在基於 MMU 的存儲系統中,本位用作系統保護 |
R(bit[9]) |
在基於 MMU 的存儲系統中,本位用作 ROM 保護 |
F(bit[10]) |
由生產商定義 |
Z(bit[11]) |
對於支持跳轉預測的ARM系統,本控制位禁止/使能跳轉預測功能 |
I(bit[12]) |
當數據cache和指令cache是分開的,本控制位禁止/使能指令cache |
V(bit[13]) |
對於支持高端異常向量表的系統,本控制位控制向量表的位置 |
PR(bit[14]) |
如果系統中的cache的淘汰算法可以選擇的話,本控制位選擇淘汰算法 |
L4(bit[15]) |
對於ARM版本5及以上的版本,本控制位可以提供兼容以前的ARM版本的功能 |
Bits[31:16]) |
這些位保留將來使用,應為UNP/SBZP |
2.3 CP15 的寄存器 C2
C2寄存器的別名:Translation table base (TTB) register
C2寄存器用來保存頁表的基地址,即一級映射描述符表的基地址。其編碼格如下所示:
31 0 |
一級映射描述符表的基地址(物理地址) |
2.4 CP15 的寄存器 C3
CP15 中的寄存器 C3 定義了 ARM 處理器的 16 個域的訪問權限。
在 CP15的C3寄存器中,划分了 16個域,每個區域由兩位構成,這兩位說明了當前內存的檢查權限:
00:當前級別下,該內存區域不允許被訪問,任何的訪問都會引起一個domain fault,這時 AP位無效
01:當前級別下,該內存區域的訪問必須配合該內存區域的段描述符中AP位進行權檢查
10:保留狀態(我們最好不要填寫該值,以免引起不能確定的問題)
11:當前級別下,對該內存區域的訪問都不進行權限檢查。 這時 AP位無效
所以只有當相應域的編碼為 01 時,才會根據 AP位 和協處理器CP15中的C1寄存器的R,S位進行權限檢查
2.5 CP15 的寄存器 C5
CP15 中的寄存器 C5 是失效狀態寄存器,分為指令狀態失效和數據狀態失效。
MRC p15, 0, , c5, c0, 0 訪問數據失效狀態寄存器
MRC p15, 0, , c5, c0, 1 訪問指令狀態失效寄存器
編碼格式如下所示:
31~9 |
8 |
7~4 |
3~0 |
UNP/SBZP |
0 |
域標識 |
狀態標識 |
其中,域標識bit[7:4]表示存放引起存儲訪問失效的存儲訪問所屬的域。狀態標識 bit[3:0] 表示放引起存儲訪問失效的存儲訪問類型,該字段含義如下表所示(優先級由上到下遞減)。
2.4 CP15的寄存器C6
CP15 中的寄存器 C6 是失效地址寄存器,其中保存了引起存儲訪問失效的地址,分為數據失效地址寄存器和指令失效地址寄存器。
MRC p15, 0, , c6, c0, 0 訪問數據失效地址寄存器
MRC p15, 0, , c6, c0, 2 訪問指令失效地址寄存器
編碼格式如下所示:
31 0 |
失效地址(虛擬地址) |
2.5 CP15的寄存器C7
CP15 的 C7 寄存器用來控制 cache 和寫緩存,它是一個只寫寄存器,讀操作將產生不可預知的后果。訪問 CP15 的 C7 寄存器的指令格式為:mcr p15, 0, Rd, CRn, CRm, opcode_2 。具體含義如下表所示(表中的數據是指Rd中的數據)
2.6 CP15的寄存器C8
系統協處理器CP15的寄存器C8就是清除TLB內容的相關操作。它是一個只寫的寄存器。
MCR p15,0,Rd,c8,CRm,opcode_2
Rd中為要寫入C8寄存器的內容,CRm和opcode_2的不同組合決定指令執行的不同操作。
2.7 CP15的寄存器C12
CP15寄存器C12用來設置異常向量基地址,其編碼格式如下所示:
MCR p15, 0, , c12, c0, 0 ;Rd中存放要修改的異常向量基地址
31~5 |
4~0 |
異常向量基地址 |
Reserve |
注:只有ARM11和cortex-a 可以任意修改異常向量基地址。arm7,ARM9,ARM10只可以在0地址或0xffff0000中
2.8 CP15的寄存器C13
CP15中的寄存器C13用於快速上下文切換。其編碼格式如下所示
31~25 |
24~0 |
PID |
0 |
其中, 在讀操作時,結果中位[31::25]返回PID,其他位 的數值是不可以預知的。寫操作將設置PID的值。當PID的值為0時,MVA = VA | (0(PID)<<25),MVA=VA,相當於禁止了FCSE。系統復位后PID即為0。當PID的值不為0時,相當於使能了FCSE。