什麼是協處理器
協處理器是一種晶片,用于減輕系統微處理器的特定處理任務。例如,數學協處理器可以控制數字處理;圖形協處理器可以處理視訊繪制。例如,intel pentium微處理器就包括内置的數學協處理器。
協處理器可以附屬于ARM處理器。一個協處理器通過擴充指令集或提供配置寄存器來擴充核心處理功能。一個或多個協處理器可以通過協處理器接口與ARM核心相連。
協處理器可以通過一組專門的、提供load-store類型接口的ARM指令來通路。例如協處理器15(CP15),ARM處理器使用協處理器15的寄存器來控制cache、TCM和存儲器管理。
協處理器也能通過提供一組專門的新指令來擴充指令集。例如,有一組專門的指令可以添加到标準ARM指令集中,以處理向量浮點(VFP)運算。
這些新指令是在ARM流水線的譯碼階段被處理的。如果在譯碼階段發現是一條協處理器指令,則把它送給相應的協處理器。如果該協處理器不存在,或不認識這條指令,則ARM認為發生了未定義指令異常。這也使得程式設計者可以用軟體來仿真協處理器的行為(使用未定義指令異常服務子程式)。
80486CPU之前有協處理器,提高浮點運算能力,那時cpu較弱才有的協處理器,現在速度是原來數百倍不止,pc機一般不存在協處理器了。
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 處理器寄存器中.
再舉個例子:
mrc p15,0,r0,c1,c0,0;将協處理器p15的寄存器中的資料傳送到ARM處理器的寄存器r0中,其中1是協處理器操作碼1,0是協處理器操作碼2,c1存放第一個操作數的協處理器寄存器,c0存放第二個操作數的協處理器寄存器
CP15協處理器詳解
1、CP15的作用及指令
CP15-系統控制協處理器 (the system control coprocessor)他通過協處理器指令MCR和MRC提供具體的寄存器來配置和控制caches、MMU、保護系統、配置時鐘模式(在bootloader時鐘初始化用到)。CP15的寄存器隻能被MRC和MCR(Move to Coprocessor from ARM Register )指令通路,其格式如下:
MCR{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
MRC{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
- 1
- 2
cond:為指令執行的條件碼。當cond忽略時指令為無條件執行。
Opcode_1:協處理器的特定操作碼. 對于CP15寄存器來說,opcode1永遠為0,不為0時,操作結果不可預知
Rd:作為源寄存器的ARM寄存器,其值将被傳送到協處理器寄存器中,或者将協處理器寄存器的值傳送到該寄存器裡面
CRn:作為目标寄存器的協處理器寄存器,其編号可能是C0,C1,…,C15。
CRm:協處理器中附加的目标寄存器或源操作數寄存器。如果不需要設定附加資訊,将CRm設定為c0,否則結果未知
Opcode_2:可選的協處理器特定操作碼。(用來區分同一個編号的不同實體寄存器,當不需要提供附加資訊時,指定為0)
在基于ARM的嵌入式系統中,存儲系統通常是通過系統控制協處理器CP15完成的。CP15可以包含16個32位的寄存器,其編号為0-15。實際上對于某些編号的寄存器可能對應有多個實體寄存器。在指令中指定特定的标志位(CRm和Opcode_2)來區分這些實體寄存器。有些類似于ARM寄存器中,處于不同的處理器模時,ARM某些寄存器可能不同。
2、CP15的寄存器介紹
CP15 的寄存器清單如下表所示:
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 是分開的還是統一的: 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.4 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 | 域辨別 | 狀态辨別 |
其中,域辨別bit[7:4]表示存放引起存儲通路失效的存儲通路所屬的域。狀态辨別 bit[3:0] 表示放引起存儲通路失效的存儲通路類型,該字段含義如下表所示(優先級由上到下遞減)。
2.5 CP15的寄存器C6
CP15 中的寄存器 C6 是失效位址寄存器,其中儲存了引起存儲通路失效的位址,分為資料失效位址寄存器和指令失效位址寄存器。
MRC p15, 0, , c6, c0, 0 通路資料失效位址寄存器
MRC p15, 0, , c6, c0, 2 通路指令失效位址寄存器
編碼格式如下所示:
31 0 |
---|
失效位址(虛拟位址) |
2.6 CP15的寄存器C7
CP15 的 C7 寄存器用來控制 cache 和寫緩存,它是一個隻寫寄存器,讀操作将産生不可預知的後果。通路 CP15 的 C7 寄存器的指令格式為:mcr p15, 0, Rd, CRn, CRm, opcode_2 。具體含義如下表所示(表中的資料是指Rd中的資料)
2.7 CP15的寄存器C8
系統協處理器CP15的寄存器C8就是清除TLB内容的相關操作。它是一個隻寫的寄存器。
MCR p15,0,Rd,c8,CRm,opcode_2
Rd中為要寫入C8寄存器的内容,CRm和opcode_2的不同組合決定指令執行的不同操作。
2.8 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.9 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。