1.協處理器和協處理器指令詳解算法
mcr & mrc緩存
mrc用於讀取CP15中的寄存器學習
mcr用於寫入CP15中的寄存器編碼
1.2什麼是協處理器?操作系統
1.SoC內部另外一處理核心,協助主CPU實現某些功能,被主CPU調用執行必定任務。.net
2.ARM設計上支持多達16個協處理器,可是通常SoC只實現其中的CP15.(cp:coprocessor)設計
3.協處理器和MMU、cache、TLB等處理有關,功能上和操做系統的虛擬地址映射、cache 管理等有關。code
1.3MRC & MCR的使用方法進程
(1)mcr{<cond>} p15, <opcode_1>, <Rd>, <Crn>, <Crm>, {<opcode_2>}內存
(2)opcode_1:對於cp15永遠爲0
(3)Rd:ARM的普通寄存器
(4)Crn:cp15的寄存器,合法值是c0~c15
(5)Crm:cp15的寄存器,通常均設爲c0
(6)opcode_2:通常省略或爲0
1.3.1 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 |
注意:
(1)<opcode_1>:協處理器行爲操做碼,對於CP15來講,<opcode_1>永遠爲0b000, 不然結果未知。
(2)<rd>:不能是r15/pc,不然,結果未知。
(3)<crn>:做爲目標寄存器的協處理器寄存器,編號爲C0~C15。
(4)<crm>:附加的目標寄存器或源操做數寄存器,若是不須要設置附加信息,將crm設置爲c0, 不然結果未知。
(5)<opcode_2>:提供附加信息好比寄存器的版本號或者訪問類型,用於區分同一個編號的不 同物理寄存器,能夠省略<opcode_2>或者將其設置爲0,不然結果未知。
1.3.2ARM處理器中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中的寄存器指令中的<opcode_2>指定要訪問哪一個具體物理寄存器,<opcode_2>與兩個標識符寄存器的對應關係以下所示:
opcode_2編碼 |
對應的標識符號寄存器 |
0b000 |
主標識符寄存器 |
0b001 |
cache類型標識符寄存器 |
其餘 |
保留 |
(2)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指令 |
附加: |
|
(3)CP15的寄存器C2
CP15中的寄存器C2保存的是頁表的基地址,即一級映射描述符表的基地址。其編碼格以下所示:
31 0 |
一級映射描述符表的基地址(物理地址) |
(4)CP15的寄存器C3
CP15中的寄存器C3定義了ARM處理器的16個域的訪問權限。
31 0 |
|||||||||||||||
D15 |
D14 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
(5)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 |
有效 |
有效 |
(6)CP15中的寄存器C6
CP15中的寄存器C5是失效地址寄存器,編碼格式以下所示:
31 0 |
失效地址(虛擬地址) |
(7)CP15中的寄存器C7
CP15的C7寄存器用來控制cache和寫緩存,它是一個只寫寄存器,讀操做將產生不可預知的後果。
訪問CP15的C7寄存器的指令格式以下所示:
mcr p15, 0, <rd>, <c7>, crm, <opcode_2> ;<rd>、<crm>和<opcode_2>的不一樣取值組合 實現不一樣功能
(8)CP15中的寄存器C8
CP15的C8寄存器用來控制清除TLB的內容,是隻寫寄存器,讀操做將產生不可預知的後果。
訪問CP15的C8寄存器的指令格式以下所示:
mcr p15, 0, <rd>, <c8>, crm, <opcode_2> ;<rd>、<crm>和<opcode_2>的不一樣取值組合實現不一樣功能,見第4.2節
(9)CP15中的寄存器C9
CP15的C9寄存器用於控制cache內容鎖定。
訪問CP15的C9寄存器的指令格式以下所示:
mcr p15, 0, <rd>, <c9>, c0, <opcode_2>
mrc p15, 0, <rd>, <c9>, c0, <opcode_2>
若是系統中包含獨立的指令cache和數據cache,那麼對應於數據cache和指令cache分別有一個獨立的cache內容鎖定寄存器,<opcode_2>用來選擇其中的某個寄存器:
<opcode_2>=1選擇指令cache的內容鎖定寄存器;
<opcode_2>=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的塊中選擇被替換的塊 |
(10)CP15的寄存器C10
CP15的C10寄存器用於控制TLB內容鎖定。
訪問CP15的C10寄存器的指令格式以下所示:
mcr p15, 0, <rd>, <c10>, c0, <opcode_2>
mrc p15, 0, <rd>, <c10>, c0, <opcode_2>
若是系統中包含獨立的指令TLB和數據TLB,那麼對應於數據TLB和指令TLB分別有一個獨立的TLB內容鎖定寄存器,<opcode_2>用來選擇其中的某個寄存器:
<opcode_2>=1選擇指令TLB的內容鎖定寄存器;
<opcode_2>=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無效操做的影響 |
(11)CP15的寄存器C13
C13寄存器用於快速上下文切換FCSE。
訪問CP15的C13寄存器的指令格式以下所示:
mcr p15, 0, <rd>, <c13>, c0, 0
mrc p15, 0, <rd>, <c13>, c0, 0
C13寄存器的編碼格式以下所示:
31 25 24 0 |
|
PID |
0 |
其中,PID表示當前進程的所在的進程空間塊的編號,即當前進程的進程標識符,取值爲0~127。
0:MVA(變換後的虛擬地址)= VA(虛擬地址),禁止FCSE(快速上下文切換技術),系統復位後PID=0;
非0:使能FCSE。
舉例:
來自於uboot
---------------------------------------------
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #1
mcr p15, 0, r0, c1, c0, 0
學習要點
瞭解代碼目的。
沒必要深究,將uboot中和kernel中起始代碼中的通常操做搞明白便可。
只看通常用法,不詳細區分參數細節,不然會陷入不少複雜未知中。
關鍵在於理解,而不在於記住。