嵌入式開發筆記(七) ARM彙編指令集基礎3

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中起始代碼中的通常操做搞明白便可。

只看通常用法,不詳細區分參數細節,不然會陷入不少複雜未知中。

關鍵在於理解,而不在於記住。

相關文章
相關標籤/搜索