協處理器CP15介紹—MCR/MRC指令(6)


概述:在基於ARM的嵌入式應用系統中,存儲系統的操作通常是由協處理器CP15完成的。CP15包含1632位的寄存器,其編號為015

而訪問CP15寄存器的指令主要是MCRMRC這兩個指令。

例如協處理器15CP15),ARM處理器使用協處理器15的寄存器來控制cacheTCM和存儲器管理。

 而訪問CP15寄存器的指令主要是MCRMRC這兩個指令:

MRC協處理器寄存器ARM處理器寄存器的數據傳送指令(出協處理器寄存器)

MCRARM處理器寄存器到協處理器寄存器數據傳送指令(入協處理器寄存器)

 

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 體系版本號

產品主編號

處理器版本號

各部分的編碼詳細含義如下表所示: 

2cache類型標識符寄存器 
指令格式: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 是分開的還是統一的:
0: 系統的數據 cache 和指令 cache 是統一的
1: 系統的數據 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
1 :使能 MMU 或者 PU 
如果系統中沒有MMU及PU,讀取時該位返回0,寫入時忽略該位。

A(bit[1])

0 :禁止地址對齊檢查
1 :使能地址對齊檢查

C(bit[2])

當數據cache和指令cache分開時,本控制位禁止/使能數據cache。當數據cache和指令cache統一時,該控制位禁止/使能整個cache。
0 :禁止數據 / 整個 cache 
1 :使能數據 / 整個 cache
如果系統中不含cache,讀取時該位返回0.寫入時忽略
當系統中不能禁止cache 時,讀取時返回1.寫入時忽略

W(bit[3])

0 :禁止寫緩沖
1 :使能寫緩沖
如果系統中不含寫緩沖時,讀取時該位返回0.寫入時忽略
當系統中不能禁止寫緩沖時,讀取時返回1.寫入時忽略

P(bit[4])

對於向前兼容26位地址的ARM處理器,本控制位控制PROG32控制信號
0 :異常中斷處理程序進入 32 位地址模式
1 :異常中斷處理程序進入26 位地址模式
如果本系統中不支持向前兼容26位地址,讀取該位時返回1,寫入時忽略

D(bit[5])

對於向前兼容26位地址的ARM處理器,本控制位控制DATA32控制信號
0 :禁止 26 位地址異常檢查
1 :使能 26 位地址異常檢查
如果本系統中不支持向前兼容26位地址,讀取該位時返回1,寫入時忽略

L(bit[6])

對於ARMv3及以前的版本,本控制位可以控制處理器的中止模型
0 :選擇早期中止模型
1 :選擇后期中止模型

B(bit[7])

對於存儲系統同時支持big-endian和little-endian的ARM系統,本控制位配置系統的存儲模式
0 : little endian 
1 : big endian
對於只支持little-endian的系統,讀取時該位返回0,寫入時忽略
對於只支持big-endian的系統,讀取時該位返回1,寫入時忽略

S(bit[8])

在基於 MMU 的存儲系統中,本位用作系統保護

R(bit[9])

在基於 MMU 的存儲系統中,本位用作 ROM 保護

F(bit[10])

由生產商定義

Z(bit[11])

對於支持跳轉預測的ARM系統,本控制位禁止/使能跳轉預測功能
0 :禁止跳轉預測功能 
1 :使能跳轉預測功能
對於不支持跳轉預測的ARM系統,讀取該位時返回0,寫入時忽略

I(bit[12])

當數據cache和指令cache是分開的,本控制位禁止/使能指令cache
0 :禁止指令 cache 
1 :使能指令 cache
如果系統中使用統一的指令cache和數據cache或者系統中不含cache,讀取該位時返回0,寫入時忽略。當系統中的指令cache不能禁止時,讀取時該位返回1,寫入時忽略

V(bit[13])

對於支持高端異常向量表的系統,本控制位控制向量表的位置
0 :選擇低端異常中斷向量 0x0~0x1c 
1 :選擇高端異常中斷向量0xffff0000~ 0xffff001c
對於不支持高端異常向量表的系統,讀取時該位返回0,寫入時忽略

PR(bit[14])

如果系統中的cache的淘汰算法可以選擇的話,本控制位選擇淘汰算法
0 :常規的 cache 淘汰算法,如隨機淘汰 
1 :預測性淘汰算法,如round-robin 淘汰算法
如果系統中cache的淘汰算法不可選擇,寫入該位時忽略。讀取該位時,根據其淘汰算法是否可以比較簡單地預測最壞情況返回0或者1

L4(bit[15])

對於ARM版本5及以上的版本,本控制位可以提供兼容以前的ARM版本的功能
0 :保持 ARMv5 以上版本的正常功能
1 :將 ARMv5 以上版本與以前版本處理器 兼容,不根據跳轉地址的 bit[0] 進行 ARM 指令和 Thumb 狀態切換: bit[0] 等於 0 表示 ARM 指令,等於 1 表示 Thumb 指令

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

其中, 在讀操作時,結果中位[31::25]返回PID,其他位 的數值是不可以預知的。寫操作將設置PID的值。當PID的值為0時,MVA = VA | (0(PID)<<25),MVA=VA,相當於禁止了FCSE。系統復位后PID即為0。當PID的值不為0時,相當於使能了FCSE。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM