ARM協處理器各寄存器功能介紹

概述

在基於ARM的嵌入式應用系統中,存儲系統的操作通常是由協處理器CP15完成的。CP15包含16個32位的寄存器,其編號爲0~15。而訪問CP15寄存器的指令主要是MCRMRC這兩個指令。

  • MRC:協處理器寄存器到ARM處理器寄存器的數據傳送指令(讀出協處理器寄存器)。
  • MCR:ARM處理器寄存器到協處理器寄存器的數據傳送指令(寫入協處理器寄存器)。

1、指令格式

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) 彙編語法表示:

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

(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中的寄存器介紹

寄存器編號 基本作用 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 因不同設計而異 因不同設計而異 因不同設計而異

(1) CP15的寄存器C0

CP15 中寄存器 C0 對應兩個標識符寄存器,由訪問 CP15 的寄存器指令指定要訪問哪個具體物理寄存器,與兩個標識符寄存器的對應關係如下所示:

opcode2 編碼 對應的標識符號寄存器
0b000 主標識符寄存器
0b001 cache類型標識符寄存器
其 他 保留

A、主標識符寄存器

  • 主標示符的編碼格式對於不同的ARM處理器版本有所不同。對於AMR7之後的處理器,其主標示符編碼格式如下 :

    • 指令格式MRC P15,0,R0,C0,C0,0,將主標示符寄存器的內容讀到AMR寄存器R0中 。
  • 各部分的編碼詳細含義如下表所示:
30**~24** 23**~20** 19**~16** 15**~4** 3**~0**
由生產商確定 產品子編號 ARM 體系版本號 產品主編號 處理器版本號

Bcache類型標識符寄存器

  • ARM 處理器中 cache 類型標識符寄存器的編碼格式如下所示:
    • 指令格式:MRC P15,0,R0,C0,C0,1,將cache類型標識符寄存器內容讀到AMR寄存器R0中
  • 各部分字段含義如下所示:
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 內容鎖定方法
0b000 寫通類型 不需要內容清除 不支持內容鎖定
0b0001 寫回類型 數據塊讀取 不支持內容鎖定
0b0010 寫回類型 由寄存器 C7 定義 不支持內容鎖定
0b0110 寫回類型 由寄存器 C7 定義 支持格式 A
0b0111 寫回類型 由寄存器 C7 定義 支持格式 B

控制字段位 [23 12] 及控制字段位 [11 0] 含義 :[23:12]用於定義DCache的屬性,[11: 0]用於定義ICache的屬性。編碼格式如下:

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) 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 <br />1 :使能 MMU 或者 PU 如果系統中沒有MMU及PU,讀取時該位返回0,寫入時忽略該位。
A(bit[1]) 0 :禁止地址對齊檢查<br />1 :使能地址對齊檢查
C(bit[2]) 當數據cache和指令cache分開時,本控制位禁止/使能數據cache。當數據cache和指令cache統一時,該控制位禁止/使能整個cache。 <br />0 :禁止數據 / 整個 cache <br />1 :使能數據 / 整個 cache <br />如果系統中不含cache,讀取時該位返回0.寫入時忽略 當系統中不能禁止cache 時,讀取時返回1.寫入時忽略
W(bit[3]) 0 :禁止寫緩衝 <br />1 :使能寫緩衝 <br />如果系統中不含寫緩衝時,讀取時該位返回0.寫入時忽略 當系統中不能禁止寫緩衝時,讀取時返回1.寫入時忽略
P(bit[4]) 對於向前兼容26位地址的ARM處理器,本控制位控制PROG32控制信號 0 :異常中斷處理程序進入 32 位地址模式 1 :異常中斷處理程序進入26 位地址模式 如果本系統中不支持向前兼容26位地址,讀取該位時返回1,寫入時忽略
D(bit[5]) 對於向前兼容26位地址的ARM處理器,本控制位控制DATA32控制信號 <br />0 :禁止 26 位地址異常檢查 <br />1 :使能 26 位地址異常檢查 <br />如果本系統中不支持向前兼容26位地址,讀取該位時返回1,寫入時忽略
L(bit[6]) 對於ARMv3及以前的版本,本控制位可以控制處理器的中止模型 <br />0 :選擇早期中止模型 <br />1 :選擇後期中止模型
B(bit[7]) 對於存儲系統同時支持big-endian和little-endian的ARM系統,本控制位配置系統的存儲模式 <br />0 : little endian <br />1 : big endian <br />對於只支持little-endian的系統,讀取時該位返回0,寫入時忽略 <br />對於只支持big-endian的系統,讀取時該位返回1,寫入時忽略
S(bit[8]) 在基於 MMU 的存儲系統中,本位用作系統保護
R(bit[9]) 在基於 MMU 的存儲系統中,本位用作 ROM 保護
F(bit[10]) 由生產商定義
Z(bit[11]) 對於支持跳轉預測的ARM系統,本控制位禁止/使能跳轉預測功能 <br />0 :禁止跳轉預測功能 <br />1 :使能跳轉預測功能<br /> 對於不支持跳轉預測的ARM系統,讀取該位時返回0,寫入時忽略
I(bit[12]) 當數據cache和指令cache是分開的,本控制位禁止/使能指令cache <br />0 :禁止指令 cache <br />1 :使能指令 cache <br />如果系統中使用統一的指令cache和數據cache或者系統中不含cache,讀取該位時返回0,寫入時忽略。當系統中的指令cache不能禁止時,讀取時該位返回1,寫入時忽略
V(bit[13]) 對於支持高端異常向量表的系統,本控制位控制向量表的位置 <br />0 :選擇低端異常中斷向量 0x0~0x1c <br />1 :選擇高端異常中斷向量0xffff0000~ 0xffff001c <br />對於不支持高端異常向量表的系統,讀取時該位返回0,寫入時忽略
PR(bit[14]) 如果系統中的cache的淘汰算法可以選擇的話,本控制位選擇淘汰算法 <br />0 :常規的 cache 淘汰算法,如隨機淘汰 <br />1 :預測性淘汰算法,如round-robin 淘汰算法 <br />如果系統中cache的淘汰算法不可選擇,寫入該位時忽略。讀取該位時,根據其淘汰算法是否可以比較簡單地預測最壞情況返回0或者1
L4(bit[15]) 對於ARM版本5及以上的版本,本控制位可以提供兼容以前的ARM版本的功能 <br />0 :保持 ARMv5 以上版本的正常功能 <br />1 :將 ARMv5 以上版本與以前版本處理器 兼容,不根據跳轉地址的 bit[0] 進行 ARM 指令和 Thumb 狀態切換: bit[0] 等於 0 表示 ARM 指令,等於 1 表示 Thumb 指令
Bits[31:16]) 這些位保留將來使用,應爲UNP/SBZP

(3)CP15的寄存器C2

C2寄存器的別名:Translation table base (TTB) register
C2寄存器用來保存頁表的基地址,即一級映射描述符表的基地址。其編碼格如下所示:

[31:0]
一級映射描述符表的基地址(物理地址)

(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位進行權限檢查。

(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] 表示放引起存儲訪問失效的存儲訪問類型,該字段含義如下表所示(優先級由上到下遞減)。

(6) CP15的寄存器C6

CP15 中的寄存器 C6 是失效地址寄存器,其中保存了引起存儲訪問失效的地址,分爲數據失效地址寄存器和指令失效地址寄存器。

MRC p15, 0, , c6, c0, 0 :訪問數據失效地址寄存器

MRC p15, 0, , c6, c0, 2 :訪問指令失效地址寄存器
編碼格式如下所示:

[31:0]
失效地址(虛擬地址)

(7) CP15的寄存器C7

CP15 的 C7 寄存器用來控制 cache 和寫緩存,它是一個只寫寄存器,讀操作將產生不可預知的後果。

訪問 CP15 的 C7 寄存器的指令格式爲:mcr p15, 0, Rd, CRn, CRm, opcode_2 。具體含義如下表所示(表中的數據是指Rd中的數據)

(8) CP15的寄存器C8

系統協處理器CP15的寄存器C8就是清除TLB內容的相關操作。它是一個只寫的寄存器。

MCR p15,0,Rd,c8,CRm,opcode_2

Rd中爲要寫入C8寄存器的內容,CRm和opcode_2的不同組合決定指令執行的不同操作。

(9) CP15的寄存器C12

CP15寄存器C12用來設置異常向量基地址,其編碼格式如下所示: MCR p15, 0, , c12, c0, 0,Rd中存放要修改的異常向量基地址

[31:5] [4:0]
異常向量基地址 Reserve

注:只有ARM11和cortex-a 可以任意修改異常向量基地址。arm7,ARM9,ARM10只可以在0地址或0xffff0000中

(10) 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。

參考鏈接:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章