(轉)ARM協處理器CP15寄存器詳解

用於系統存儲管理的協處理器CP15

 

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

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

coproc         指令操作的協處理器名.標準名爲pn,n,爲0~15 

opcode1      協處理器的特定操作碼. 對於CP15寄存器來說,opcode1永遠爲0,不爲0時,操作結果不可預知

Rd              作爲源寄存器,即 ARM core register ,但是不能是r15/pc,否則,結果未知

CRd             作爲目標寄存器的協處理器寄存器. 

CRn             存放第1個操作數的協處理器寄存器. 

CRm            存放第2個操作數的協處理器寄存器. (用來區分同一個編號的不同物理寄存器,當不需要提供附加信息時,指定爲C0)

opcode2     可選的協處理器特定操作碼.                (用來區分同一個編號的不同物理寄存器,當不需要提供附加信息時,指定爲0)

 

  • 在基於ARM的嵌入式系統中,存儲系統通常是通過系統控制協處理器CP15完成的。
  • CP15可以包含16個32位的寄存器,其編號爲0-15。實際上對於某些編號的寄存器可能對應有多個物理寄存器。在指令中指定特定的標誌位來區分這些物理寄存器。有些類似於ARM寄存器中,處於不同的處理器模式時,ARM某些寄存器可能不同。

 

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

因不同設計而異

因不同設計而異

因不同設計而異

 

注:以下寄存器中相應位的含義在不同的處理器中可能不同,但總體功能不變

 

(一)CP15 的寄存器 C0

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

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

產品主編號

處理器版本號

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

                   說     明

位 [3: 0]

生產商定義的處理器版本號

位 [15: 4]

生產商定義的產品主編號

其中最高 4 位即位 [15:12] 可能的取值爲0x0~0x7 但不能是 0x0 或 0x7

因爲:

0x0表示 ARM7之前的處理器

0x7 表示ARM7處理器

位 [19: 16]

ARM 體系的版本號,可能的取值如 下:

0x1   ARM 體系版本 4

0x2   ARM 體系版本 4T

0x3   ARM 體系版本 5

0x4   ARM 體系版本 5T

0x5   ARM 體系版本 5TE

其他   由 ARM 公司保留將來使用

位 [23: 20]

生產商定義的產品子編號。當產品主編號相同時,使用子編號來區分不同的產品子類,如產品中不 同的高速緩存的大小等

位 [31: 24]

生產廠商的編號,現在已經定義的有以下值:

0x41  =A  ARM 公司

0x44  =D  Digital Equipment 公司

0x69  =I   intel 公司

 

(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 是分開的還是統一的:

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

 

(二)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

  

(三)CP15 的寄存器 C2

C2寄存器的別名:Translation table base (TTB) register

 C2寄存器用來保存頁表的基地址,即一級映射描述符表的基地址。其編碼格如下所示:

31                                                                                                     0

                                    一級映射描述符表的基地址(物理地址)

 

(四)CP15 的寄存器 C3

CP15 中的寄存器 C3 定義了 ARM 處理器的 16 個域的訪問權限。

31                                                                                                     0

D15

D14

D13

D12

D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0

 

在 CP15的C3寄存器中,劃分了 16個域,每個區域由兩位構成,這兩位說明了當前內存的檢查權限:

00:當前級別下,該內存區域不允許被訪問,任何的訪問都會引起一個domain fault,這時 AP位無效

01:當前級別下,該內存區域的訪問必須配合該內存區域的段描述符中AP位進行權檢查
10:保留狀態(我們最好不要填寫該值,以免引起不能確定的問題)
11:當前級別下,對該內存區域的訪問都不進行權限檢查。 這時 AP位無效 

 

所以只有當相應域的編碼爲 01 時,纔會根據  AP位 和協處理器CP15中的C1寄存器的R,S位進行權限檢查

 

(五)CP15 的寄存器 C5

CP15 中的寄存器 C5 是失效狀態寄存器,分爲指令狀態失效和數據狀態失效。

MRC p15, 0, <Rd>, c5, c0, 0   訪問數據失效狀態寄存器
MRC p15, 0, <Rd>, c5, c0, 1   訪問指令狀態失效寄存器
編碼格式如下所示:

31            9

8

7    4

3      0

UNP/SBZP

0

域標識

狀態標識

 

其中,域標識bit[7:4]表示存放引起存儲訪問失效的存儲訪問所屬的域。

狀態標識 bit[3:0] 表示放引起存儲訪問失效的存儲訪問類型,該字段含義如下表所示(優先級由上到下遞減)。

引起訪問失效的原因

狀態標識

域標識

C6

終 端異常( Terminal Exception )

0b0010

無 效

生 產商定義

中 斷向量訪問異常( Vector Exception)

0b0000

無 效

有 效

地 址對齊

0b00x1

無 效

有 效

一 級頁表訪問失效

0b1100

無 效

有 效

二 級頁表訪問失效

0b1110

有 效

有 效

基 於段的地址變換失效

0b0101

無 效

有 效

基 於頁的地址變換失效

0b0111

有 效

有 效

基 於段的存儲訪問中域控制失效

0b1001

有 效

有 效

基 於頁的存儲訪問中域控制失效

0b1101

有 效

有 效

基 於段的存儲訪問中訪問權限控制失效

0b1111

有 效

有 效

基 於頁的存儲訪問中訪問權限控制失效

0b0100

有 效

有 效

基 於段的 cache 預 取時外部存儲系統失效

0b0110

有 效

有 效

基 於頁的 cache 預 取時外部存儲系統失效

0b1000

有 效

有 效

基 於段的非 cache 預 取時外部存儲系統失效

0b1010

有 效

有 效

 

(六)CP15的寄存器C6

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

MRC p15, 0, <Rd>, c6, c0, 0  訪問數據失效地址寄存器
MRC p15, 0, <Rd>, c6, c0, 2  訪問指令失效地址寄存器

編碼格式如下所示:

31                                                                                                      0

                        失效地址(虛擬地址)

 

(七)CP15的寄存器C7

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

訪問 CP15 的 C7 寄存器的指令格式如下所示:

mcr p15, 0, <rd>, <c7>, crm, <opcode_2>               ;<rd> 、 <crm> 和 <opcode_2> 的不同取值組合,實現不同功能

 

表中的數據是指Rd中的數據:

 

(八)CP15的寄存器C8

 

指令

Rd

含義

MCR p15, 0, Rd, c8, c5, 0

0

使無效整個指令TLB

MCR p15, 0, Rd, c8, c5, 1

虛擬地址

使無效指令TLB中的單個地址變換條目

MCR p15, 0, Rd, c8, c6, 0

0

使無效整個數據TLB

MCR p15, 0, Rd, c8, c6, 1

虛擬地址

使無效數據TLB中的單個地址變換條目

MCR p15, 0, <Rd>, c8, c7, 0

0

使無效整個數據和指令TLB

MCR p15, 0, <Rd>, c8, c7, 1

虛擬地址

使無效數據和指令TLB中的單個地址變換條目

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

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

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

 

(九)CP15的寄存器C12

CP15寄存器C12用來設置異常向量基地址,其編碼格式如下所示:

MCR p15, 0, <Rd>, c12, c0, 0                 ;Rd中存放要修改的異常向量基地址

31              5

4         0

異常向量基地址

Reserve

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

 

(十)CP15的寄存器C13

CP15中的寄存器C13用於快速上下文切換。其編碼格式如下所示。

訪問寄存器C13的指令格式如下所示。

MCR           p15, 0,<Rd>,<c13>,c0,0

MRC           P15, 0,<Rd>,<c13>,c0,0

其中, 在讀操作時,結果中位[31::25]返回PID,其他位 的數值是不可以預知的。寫操作將設置PID的值。

        當PID的值爲0時,MVA = VA  |  (0(PID)<<25),MVA=VA,相當於禁止了FCSE。系統復位後PID即爲0.

        當PID的值不爲0時,相當於使能了FCSE。

 

 

 

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