轉載自:http://blog.chinaunix.net/uid-14114479-id-3110951.html
ARM926EJ-S/ARM920T 協處理器 CP14, CP15 詳解
ARM 微處理器可支持多達 16 個協處理器,用於各種協處理操作,在程序執行的過程中,
每個協處理器只執行鍼對自身的協處理指令,忽略 ARM 處理器和其他協處理器的指令。
ARM 的協處理器指令主要用於 ARM 處理器初始化 ARM 協處理器的數據處理操作,以及
在 ARM 處理器的寄存器和協處理器的寄存器之間傳送數據,和在 ARM 協處理器的寄存器
和存儲器之間傳送數據。 ARM 協處理器指令包括以下 5 條:
— CDP 協處理器數操作指令
— LDC 協處理器數據加載指令
— STC 協處理器數據存儲指令
— MCR ARM 處理器寄存器到協處理器寄存器的數據傳送指令
— MRC 協處理器寄存器到 ARM 處理器寄存器的數據傳送指令
1、CDP 指令
CDP 指令的格式爲:
CDP{條件} 協處理器編碼,協處理器操作碼 1,目的寄存器,源寄存器 1,源寄存器 2,協
處理 器操作碼 2。 CDP 指令用於 ARM 處理器通知 ARM 協處理器執行特定的操作,若協處
理器不能成功完成特定的操作,則產生未定義指令異常。其中協處理器操作碼 1 和協處理
器操作碼 2 爲協處理器將要執行的操作,目的寄存器和源寄存器均爲協處理器的寄存器,
指令不涉及 ARM 處理器的寄存器和存儲器。
指令示例:
CDP P3 , 2 , C12 , C10 , C3 , 4 ;該指令完成協處理器 P3 的初始化
2、LDC 指令
LDC 指令的格式爲:
LDC{條件}{L} 協處理器編碼,目的寄存器,[源寄存器]
LDC 指令用於將源寄存器所指向的存儲器中的字數據傳送到目的寄存器中,若協處理器不
能成功完成傳送操作,則產生未定義指令異常。其中,{L}選項表示指令爲長讀取操作,如
用於雙精度數據的傳輸。
指令示例:
LDC P3 , C4 , [R0] ;將 ARM 處理器的寄存器 R0 所指向的存儲器中的字數據傳送到
協處理器 P3 的寄存器 C4 中。
3、STC 指令
STC 指令的格式爲:
STC{條件}{L} 協處理器編碼,源寄存器,[目的寄存器]
STC 指令用於將源寄存器中的字數據傳送到目的寄存器所指向的存儲器中,若協處理器不
能成功完成傳送操作,則產生未定義指令異常。其中,{L}選項表示指令爲長讀取操作,如
用於雙精度數據的傳輸。
指令示例:
STC P3 , C4 , [R0] ;將協處理器 P3 的寄存器 C4 中的字數據傳送到 ARM 處理器的
寄存器 R0 所指向的存儲器中。
4、MCR 指令
MCR 指令的格式爲:
MCR{條件} 協處理器編碼,協處理器操作碼 1,源寄存器,目的寄存器 1,目的寄存器 2,
協處理器操作碼 2。
MCR 指令用於將 ARM 處理器寄存器中的數據傳送到協處理器寄存器中,若協處理器不能成
功完成操作,則產生未定義指令異常。其中協處理器操作碼 1 和協處理器操作碼 2 爲協處
理器將要執行的操作,源寄存器爲 ARM 處理器的寄存器,目的寄存器 1 和目的寄存器 2 均
爲協處理器的寄存器。
指令示例:
MCR P3,3,R0,C4,C5,6;該指令將 ARM 處理器寄存器 R0 中的數據傳送到協處理
器 P3 的寄存器 C4 和 C5 中。
5、MRC 指令
MRC 指令的格式爲:
MRC{條件} 協處理器編碼,協處理器操作碼 1,目的寄存器,源寄存器 1,源寄存器 2,協
處理器操作碼 2。
MRC 指令用於將協處理器寄存器中的數據傳送到 ARM 處理器寄存器中,若協處理器不能成
功完成操作,則產生未定義指令異常。其中協處理器操作碼 1 和協處理器操作碼 2 爲協處
理器將要執行的操作,目的寄存器爲 ARM 處理器的寄存器,源寄存器 1 和源寄存器 2 均
爲協處理器的寄存器。
指令示例:
MRC P3,3,R0,C4,C5,6;該指令將協處理器 P3 的寄存器中的數據傳送到 ARM 處理
器寄存器中.
The ARM920T 有兩個具體協處理器
CP14 調試通信通道協處理器
調試通信通道協處理器 DCC(the Debug Communications Channel)提供了兩個 32bits寄存
器用於傳送數據,還提供了 6bits 通信數據控制寄存器控制寄存器中的兩個位提供目標和主
機調試器之間的同步握手。
通信數據控制寄存器
以下指令在 Rd 中返回控制寄存器的值:
MRC p14, 0, Rd, c0, c0
此控制寄存器中的兩個位提供目標和主機調試器之間的同步握手:
位 1(W 位) 從目標的角度表示通信數據寫入寄存器是否空閒:
W = 0 目標應用程序可以寫入新數據。
W = 1 主機調試器可以從寫入寄存器中掃描出新數據。
位 0(R 位) 從目標的角度表示通信數據讀取寄存器中是否有新數據:
R = 1 有新數據,目標應用程序可以讀取。
R = 0 主機調試器可以將新數據掃描到讀取寄存器中。
注意
調試器不能利用協處理器 14 直接訪問調試通信通道,因爲這對調試器無意義。 但調試
器可使用掃描鏈讀寫 DCC 寄存器。 DCC 數據和控制寄存器可映射到 EmbeddedICE 邏輯
單元中的地址。 若要查看 EmbeddedICE 邏輯寄存器,請參閱您的調試器和調試目標的相
關文檔。
通信數據讀取寄存器
用於接收來自調試器的數據的 32 位寬寄存器。 以下指令在 Rd 中返
回讀取寄存器的值:
MRC p14, 0, Rd, c1, c0
通信數據寫入寄存器
用於向調試器發送數據的 32 位寬寄存器。 以下指令將 Rn 中的值寫
到寫入寄存器中:
MCR p14, 0, Rn, c1, c0
注意
有關訪問 ARM10 和 ARM11 內核 DCC 寄存器的信息,請參閱相應的技術參考手冊。 ARM9 之後的各處理器中,所用指令、狀態位位置以及對狀態位的解釋都有所不同。
目標到調試器的通信
這是運行於 ARM 內核上的應用程序與運行於主機上的調試器之間的通信事件
順序:
1. 目標應用程序檢查 DCC 寫入寄存器是否空閒可用。爲此,目標應用程序使
用 MRC 指令讀取調試通信通道控制寄存器,以檢查 W 位是否已清除。
2. 如果 W 位已清除,則通信數據寫入寄存器已清空,應用程序對協處理器 14
使用 MCR 指令將字寫入通信數據寫入寄存器。 寫入寄存器操作會自動設置
W 位。如果 W 位已設置,則表明調試器尚未清空通信數據寫入寄存器。此
時,如果應用程序需要發送另一個字,它必須輪詢 W 位,直到它已清除。
3. 調試器通過掃描鏈 2 輪詢通信數據控制寄存器。 如果調試器發現 W 位已設
置,則它可以讀 DCC 數據寄存器,以讀取應用程序發送的信息。 讀取數據
的進程會自動清除通信數據控制寄存器中的 W 位。
以下代碼顯示了這一過程
AREA OutChannel, CODE, READONLY
ENTRY
MOV r1,#3 ; Number of words to send
ADR r2, outdata ; Address of data to send
pollout
MRC p14,0,r0,c0,c0 ; Read control register
TST r0, #2
BNE pollout ; if W set, register still full
write
LDR r3,[r2],#4 ; Read word from outdata
; into r3 and update the pointer
MCR p14,0,r3,c1,c0 ; Write word from r3
SUBS r1,r1,#1 ; Update counter
BNE pollout ; Loop if more words to be written
MOV r0, #0x18 ; Angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SVC 0x123456 ; ARM semihosting (formerly SWI)
outdata
DCB "Hello there!"
END
調試器到目標的通信
這是運行於主機上的調試器向運行於內核上的應用程序傳輸消息的事件順序:
1. 調試器輪詢通信數據控制寄存器的 R 位。 如果 R 位已清除,則通信數據讀
取寄存器已清空,可將數據寫入此寄存器,以供目標應用程序讀取。
2. 調試器通過掃描鏈 2 將數據掃描到通信數據讀取寄存器中。此操作會自動
設置通信數據控制寄存器中的 R 位。
3. 目標應用程序輪詢通信數據控制寄存器中的 R 位。如果該位已經設置,則
通信數據讀取寄存器中已經有數據,應用程序可使用 MRC 指令從協處理器
14 讀取該數據。 同時,讀取指令還會清除 R 位。
以下顯示的目標應用程序代碼演示了這一過程
AREA InChannel, CODE, READONLY
ENTRY
MOV r1,#3 ; Number of words to read
LDR r2, =indata ; Address to store data read
pollin
MRC p14,0,r0,c0,c0 ; Read control register
TST r0, #1
BEQ pollin ; If R bit clear then loop
read
MRC p14,0,r3,c1,c0 ; read word into r3
STR r3,[r2],#4 ; Store to memory and
; update pointer
SUBS r1,r1,#1 ; Update counter
BNE pollin ; Loop if more words to read
MOV r0, #0x18 ; Angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SVC 0x123456 ; ARM semihosting (formerly SWI)
AREA Storage, DATA, READWRITE
indata
DCB "Duffmessage#"
END
CP15 系統控制協處理器
CP15 —系統控制協處理器 (the system control coprocessor)他通過協處理器指令 MCR和 MRC 提供具體的寄存器來配置和控制 caches、MMU、保護系統、配置時鐘模式(在
bootloader時鐘初始化用到)
CP15 的寄存器只能被 MRC和 MCR(Move to Coprocessor from ARM Register )指令訪問
MCR{cond} p15,,,,,
MRC{cond} p15,,,,,
其中 L 位用來區分 MCR(L=1)和 MRC(L=0)操作. CP15 包括 15 個具體的寄存器如下
-R0:ID 號寄存器
-R0:緩存類型寄存器
-R1:控制寄存器
-R2:轉換表基址寄存器(Translation Table Base --TTB)
-R3:域訪問控制寄存器(Domain access control )
-R4:保留
-R5:異常狀態寄存器(fault status -FSR)
-R6:異常地址寄存器(fault address -FAR)
-R7:緩存操作寄存器
-R8:TLB 操作寄存器
-R9:緩存鎖定寄存器
-R10:TLB 鎖定寄存器
-R11-12&14:保留
-R13:處理器 ID
-R15:測試配置寄存器 2-24
要注意有 2個 R0,根據MCR 操作數的不同傳送不同的值,這也一個只讀寄存器
-R0:ID 號寄存器 這是一個只讀寄存器,返回一個 32 位的設備 ID 號,具體功能參考 ARM
各個系列型號的的 CP15 Register 0 說明.
MRC p15, 0, , c0, c0, {0, 3-7} ;returns ID
以下爲 ID Code 詳細描敘(ARM926EJ-S); ARM920T Part Number 爲 0x920,Architecture
(ARMv4T) 爲 0x2 具體可參照 ARM各型號.
-R0:緩存類型寄存器(CACHE TYPE REGISTER),包含了 caches 的信息。讀這個寄存器
的方式是通過設置協處理操作碼爲 1.
MRC p15, 0, , c0, c0, 1; returns cache details
以下爲 CP15的一些應用示例
U32 ARM_CP15_DeviceIDRead(void)
{
U32 id;
__asm { MRC P15, 0, id, c0, c0; }
return id;
}
void ARM_CP15_SetPageTableBase(P_U32 TableAddress)
{
__asm { MCR P15, 0, TableAddress, c2, c0, 0; }
}
void ARM_CP15_SetDomainAccessControl(U32 flags)
{
__asm { MCR P15, 0, flags, c3, c0, 0; }
}
void ARM_CP15_ICacheFlush()
{
unsigned long dummy;
__asm { MCR p15, 0, dummy, c7, c5, 0; }
}
void ARM_CP15_DCacheFlush()
{
unsigned long dummy;
__asm { MCR p15, 0, dummy, c7, c6, 0; }
}
void ARM_CP15_CacheFlush()
{
unsigned long dummy;
__asm { MCR p15, 0, dummy, c7, c7, 0; }
}
void ARM_CP15_TLBFlush(void)
{
unsigned long dummy;
__asm { MCR P15, 0, dummy, c8, c7, 0; }
}
void ARM_CP15_ControlRegisterWrite(U32 flags)
{
__asm { MCR P15, 0, flags, c1, c0; }
}
void ARM_CP15_ControlRegisterOR(U32 flag)
{
__asm {
mrc p15,0,r0,c1,c0,0
mov r2,flag
orr r0,r2,r0
mcr p15,0,r0,c1,c0,0
}
}
void ARM_CP15_ControlRegisterAND(U32 flag)
{
__asm {
mrc p15,0,r0,c1,c0,0
mov r2,flag
and r0,r2,r0
mcr p15,0,r0,c1,c0,0
}
}
void ARM_MMU_Init(P_U32 TableAddress)
{
ARM_CP15_TLBFlush();
ARM_CP15_CacheFlush();
ARM_CP15_SetDomainAccessControl(0xFFFFFFFF);
ARM_CP15_SetPageTableBase(TableAddress);
}
void Enable_MMU (void)
{
__asm {
mrc p15,0,r0,c1,c0,0
mov r2, #0x00000001
orr r0,r2,r0
mcr p15,0,r0,c1,c0,0
}
printf("MMU enabled\n");
}
void Disable_MMU (void)
{
__asm {
mrc p15,0,r0,c1,c0,0
mov r2, #0xFFFFFFFE
and r0,r2,r0
mcr p15,0,r0,c1,c0,0
}
printf("MMU disabled\n");
}
本文來自 CSDN 博客,轉載請標明出處:file:///F:/data/arm/arm 協處理器
cp14 cp15 - kuteng8801的專欄 - CSDN 博客.mht
訪問CP15寄存器的指令
訪問CP15寄存器指令的編碼格式及語法說明如下:
31 28 |
27 24 |
23 21 |
20 |
19 16 |
15 12 |
11 8 |
7 5 |
4 |
3 0 |
cond |
1 1 1 0 |
opcode_1 |
L |
cr n |
rd |
1 1 1 1 |
opcode_2 |
1 |
crm |
說明:
:協處理器行爲操作碼,對於CP15來說,永遠爲0b000,否則結果未知。
:不能是r15/pc,否則,結果未知。
:作爲目標寄存器的協處理器寄存器,編號爲C0~C15。
:附加的目標寄存器或源操作數寄存器,如果不需要設置附加信息,將crm設置爲c0,否則結果未知。
:提供附加信息比如寄存器的版本號或者訪問類型,用於區分同一個編號的不同物理寄存器,可以省略或者將其設置爲0,否則結果未知。
指 令 |
說 明 |
語法格式 |
mcr |
將ARM處理器的寄存器中的數據寫到CP15中的寄存器中 |
mcr{} p15, , , , , {} |
mrc |
將CP15中的寄存器中的數據讀到ARM處理器的寄存器中 |
mcr{} p15, , , , , {} |
4.1.2 CP15寄存器介紹
CP15的寄存器列表如表4-1所示。
表4-1 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中的寄存器指令中的指定要訪問哪個具體物理寄存器,與兩個標識符寄存器的對應關係如下所示:
opcode_2編碼 |
對應的標識符號寄存器 |
0b000 |
主標識符寄存器 |
0b001 |
cache類型標識符寄存器 |
其他 |
保留 |
1)主標識符寄存器
訪問主標識符寄存器的指令格式如下所示:
mrc p15, 0, r0, c0, c0, 0 ;將主標識符寄存器C0,0的值讀到r0中
ARM不同版本體系處理器中主標識符寄存器的編碼格式說明如下。
ARM7之後處理器的主標識符寄存器編碼格式如下所示:
31 24 23 20 19 16 15 4 3 0 |
||||
由生產商確定 |
產品子編號 |
ARM體系版本號 |
產品主編號 |
處理器版本號 |
位 |
說 明 |
位[3: 0] |
生產商定義的處理器版本號 |
位[15: 4] |
生產商定義的產品主編號,其中最高4位即位[15:12]可能的取值爲0~7但不能是0或7 |
位[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公司 |
ARM7處理器的主標識符寄存器編碼格式如下所示:
31 24 23 22 16 15 4 3 0 |
||||
由生產商確定 |
A |
產品子編號 |
產品主編號 |
處理器版本號 |
位 |
說 明 |
位[3: 0] |
生產商定義的處理器版本號 |
位[15: 4] |
生產商定義的產品主編號,其中最高4位即位[15:12]的值爲0x7 |
位[22: 16] |
生產商定義的產品子編號,當產品主編號相同時,使用子編號來區分不同的產品子類,如產品中不同的高速緩存的大小等 |
續表
位 |
說 明 |
位[23] |
ARM7支持下面兩種ARM體系的版本號: 0x0 ARM體系版本3 0x1 ARM體系版本4T |
位[31: 24] |
生產廠商的編號,現在已經定義的有以下值: 0x41 =A ARM公司 0x44 =D Digital Equipment公司 0x69 =I Intel公司 |
ARM7之前處理器的主標識符寄存器編碼格式如下所示:
31 24 23 22 16 15 4 3 0 |
||||
由生產商確定 |
A |
產品子編號 |
產品主編號 |
處理器版本號 |
位 |
說 明 |
位[3: 0] |
生產商定義的處理器版本號 |
位[15: 4] |
生產商定義的產品主編號,其中最高4位即爲[15:12]的值爲0x7 |
位[22: 16] |
生產商定義的產品子編號,當產品主編號相同時,使用子編號來區分不同的產品子類,如產品中不同的高速緩存的大小等 |
位[23] |
ARM7支持下面兩種ARM體系的版本號: 0x0 ARM體系版本3 0x1 ARM體系版本4T |
位[31: 24] |
生產廠商的編號,現在已經定義的有以下值: 0x41 =A ARM公司 0x44 =D Digital Equipment公司 0x69 =I intel公司 |
2)cache類型標識符寄存器
訪問cache類型標識符寄存器的指令格式如下所示:
mrc p15, 0, r0, c0, c0, 1 ;將cache類型標識符寄存器C0,1的值讀到r0中
ARM處理器中cache類型標識符寄存器的編碼格式如下所示:
31 29 28 25 24 23 12 11 0 |
|||||
0 0 0 |
屬性字段 |
S |
數據cache相關屬性 |
指令cache相關屬性 |
位 |
說明 |
位[28: 25] |
指定控制字段位[24: 0]指定的屬性之外的cache的其他屬性,詳見表4-2 |
位[24] |
定義系統中的數據cache和指令cache是分開的還是統一的: 0 系統的數據cache和指令cache是統一的; 1 系統的數據cache和指令cache是分開的 |
位[23: 12] |
定義數據cache的相關屬性,如果位[24]爲0,本字段定義整個cache的屬性 |
位[31: 24] |
定義指令cache的相關屬性,如果位[24]爲0,本字段定義整個cache的屬性 |
其中控制字段位[28:25]的含義說明如下:
表4-2 cache類型標識符寄存器的控制字段位[28:25]
編 碼 |
cache類型 |
cache內容清除方法 |
cache內容鎖定方法 |
0b0000 |
寫通類型 |
不需要內容清除 |
不支持內容鎖定 |
0b0001 |
寫回類型 |
數據塊讀取 |
不支持內容鎖定 |
0b0010 |
寫回類型 |
由寄存器C7定義 |
不支持內容鎖定 |
0b0110 |
寫回類型 |
由寄存器C7定義 |
支持格式A |
0b0111 |
寫回類型 |
由寄存器C7定義 |
支持格式B |
控制字段位[23:12]和控制字段位[11:0]的編碼格式相同,含義如下所示:
11 9 8 6 5 3 2 1 0 |
|||||
0 0 0 |
cache容量 |
cache相聯特性 |
M |
塊大小 |
cache容量字段bits[8: 6]的含義如下所示:
編 碼 |
M=0時含義(單位KB) |
M=1時含義(單位KB) |
0b000 |
0.5 |
0.75 |
0b001 |
1 |
1.5 |
0b010 |
2 |
3 |
0b011 |
4 |
6 |
0b100 |
8 |
12 |
0b101 |
16 |
24 |
0b110 |
32 |
48 |
0b111 |
64 |
96 |
cache相聯特性字段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路相聯 |
cache塊大小字段bits[1: 0]的含義如下所示:
編 碼 |
cache塊大小 |
0b00 |
2個字(8字節) |
0b01 |
4個字(16字節) |
0b10 |
8個字(32字節) |
0b11 |
16個字(64字節) |
CP15的寄存器C1
訪問主標識符寄存器的指令格式如下所示:
mrc p15, 0, r0, c1, c0{, 0} ;將CP15的寄存器C1的值讀到r0中
mcr p15, 0, r0, c1, c0{, 0} ;將r0的值寫到CP15的寄存器C1中
CP15中的寄存器C1的編碼格式及含義說明如下:
31 16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
附加 |
L4 |
RR |
V |
I |
Z |
F |
R |
S |
B |
L |
D |
P |
W |
C |
A |
M |
位 |
說 明 |
M |
0:禁止MMU或者PU;1:使能MMU或者PU |
A |
0:禁止地址對齊檢查;1:使能地址對齊檢查 |
C |
0:禁止數據/整個cache;1:使能數據/整個cache |
W |
0:禁止寫緩衝;1:使能寫緩衝 |
P |
0:異常中斷處理程序進入32位地址模式;1:異常中斷處理程序進入26位地址模式 |
D |
0:禁止26位地址異常檢查;1:使能26位地址異常檢查 |
L |
0:選擇早期中止模型;1:選擇後期中止模型 |
B |
0:little endian;1:big endian |
S |
在基於MMU的存儲系統中,本位用作系統保護 |
R |
在基於MMU的存儲系統中,本位用作ROM保護 |
F |
0:由生產商定義 |
Z |
0:禁止跳轉預測功能;1:使能跳轉預測指令 |
I |
0:禁止指令cache;1:使能指令cache |
V |
0:選擇低端異常中斷向量0x0~0x1c;1:選擇高端異常中斷向量0xffff0000~ 0xffff001c |
RR |
0:常規的cache淘汰算法,如隨機淘汰;1:預測性淘汰算法,如round-robin淘汰算法 |
L4 |
0:保持ARMv5以上版本的正常功能;1:將ARMv5以上版本與以前版本處理器兼容,不根據跳轉地址的bit[0]進行ARM指令和Thumb狀態切換:bit[0]等於0表示ARM指令,等於1表示Thumb指令 |
附加: |
|
CP15的寄存器C2
CP15中的寄存器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的寄存器C5
CP15中的寄存器C5是失效狀態寄存器,編碼格式如下所示:
31 9 8 7 4 3 0 |
|||
UNP/SBZP |
0 |
域標識 |
狀態標識 |
其中,域標識bit[7:4]表示存放引起存儲訪問失效的存儲訪問所屬的域。
狀態標識bit[3:0]表示放引起存儲訪問失效的存儲訪問類型,該字段含義如表4-3所示(優先級由上到下遞減)。
表4-3 狀態標識字段含義
引起訪問失效的原因 |
狀態標識 |
域標識 |
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中的寄存器C5是失效地址寄存器,編碼格式如下所示:
31 0 |
失效地址(虛擬地址) |
CP15中的寄存器C7
CP15的C7寄存器用來控制cache和寫緩存,它是一個只寫寄存器,讀操作將產生不可預知的後果。
訪問CP15的C7寄存器的指令格式如下所示:
mcr p15, 0, , , crm, ;、和的不同取值組合 實現不同功能
CP15中的寄存器C8
CP15的C8寄存器用來控制清除TLB的內容,是隻寫寄存器,讀操作將產生不可預知的後果。
訪問CP15的C8寄存器的指令格式如下所示:
mcr p15, 0, , , crm, ;、和的不同取值組合實現不同功能,見第4.2節
CP15中的寄存器C9
CP15的C9寄存器用於控制cache內容鎖定。
訪問CP15的C9寄存器的指令格式如下所示:
mcr p15, 0, , , c0,
mrc p15, 0, , , c0,
如果系統中包含獨立的指令cache和數據cache,那麼對應於數據cache和指令cache分別有一個獨立的cache內容鎖定寄存器,用來選擇其中的某個寄存器:
=1選擇指令cache的內容鎖定寄存器;
=0選擇數據cache的內容鎖定寄存器。
CP15的C9寄存器有A、B兩種編碼格式。編碼格式A如下所示:
31 32-W 31-W 0 |
|
cache組內塊序號index |
0 |
其中index表示當下一次發生cache未命中時,將預取的存儲塊存入cache中該塊對應的組中序號爲index的cache塊中。此時序號爲0~index-1的cache塊被鎖定,當發生cache替換時,從序號爲index到ASSOCIATIVITY的塊中選擇被替換的塊。
編碼格式B如下所示:
31 30 W W-1 0 |
||
L |
0 |
cache組內塊序號index |
位 |
說 明 |
L=0 |
當發生cache未命中時,將預取的存儲塊存入cache中該塊對應的組中序號爲index的cache塊中 |
續表
位 |
說 明 |
L=1 |
如果本次寫操作之前L=0,並且index值小於本次寫入的index,本次寫操作執行的結果不可預知;否則,這時被鎖定的cache塊包括序號爲0~index-1的塊,當發生cache替換時,從序號爲index到ASSOCIATIVITY的塊中選擇被替換的塊 |
CP15的寄存器C10
CP15的C10寄存器用於控制TLB內容鎖定。
訪問CP15的C10寄存器的指令格式如下所示:
mcr p15, 0, , , c0,
mrc p15, 0, , , c0,
如果系統中包含獨立的指令TLB和數據TLB,那麼對應於數據TLB和指令TLB分別有一個獨立的TLB內容鎖定寄存器,用來選擇其中的某個寄存器:
=1選擇指令TLB的內容鎖定寄存器;
=0選擇數據TLB的內容鎖定寄存器。
C10寄存器的編碼格式如下:
31 30 32-W 31-W 32-2W 31-2W 1 0 |
|||
可被替換的條目起始地址的base |
下一個將被替換的條目地址victim |
0 |
P |
位 |
說 明 |
victim |
指定下一次TLB沒有命中(所需的地址變換條目沒有包含在TLB中)時,從內存頁表中讀取所需的地址變換條目,並把該地址變換條目保存在TLB中地址victim處 |
base |
指定TLB替換時,所使用的地址範圍,從(base)到(TLB中條目數-1);字段victim的值應該包含在該範圍內 |
P |
1:寫入TLB的地址變換條目不會受使整個TLB無效操作的影響,一直保持有效;0:寫入TLB的地址變換條目將會受到使整個TLB無效操作的影響 |
CP15的寄存器C13
C13寄存器用於快速上下文切換FCSE。
訪問CP15的C13寄存器的指令格式如下所示:
mcr p15, 0, , , c0, 0
mrc p15, 0, , , c0, 0
C13寄存器的編碼格式如下所示:
31 25 24 0 |
|
PID |
0 |
其中,PID表示當前進程的所在的進程空間塊的編號,即當前進程的進程標識符,取值爲0~127。
0:MVA(變換後的虛擬地址)= VA(虛擬地址),禁止FCSE(快速上下文切換技術),系統復位後PID=0;
非0:使能FCSE。