ARM學習之協處理(disable cache,mmu)

ARM 367瀏覽

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?處理器寄存器中.

?

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

說明:

<opcode_1>:協處理器行為操作碼,對于CP15來說,<opcode_1>永遠為0b000,否則結果未知。

<rd>:不能是r15/pc,否則,結果未知。

<crn>:作為目標寄存器的協處理器寄存器,編號為C0~C15。

<crm>:附加的目標寄存器或源操作數寄存器,如果不需要設置附加信息,將crm設置為c0,否則結果未知。

<opcode_2>:提供附加信息比如寄存器的版本號或者訪問類型,用于區分同一個編號的不同物理寄存器,可以省略<opcode_2>或者將其設置為0,否則結果未知。

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 中的寄存器 C7 用于控制 cache 和寫緩沖區。它是一個只寫的寄存器,使用 MCR 指令
????? 來寫該寄存器,具體格式如下:

????????? MCR P15, 0, <Rd>, <c7>, <CRm>, <opcode_2>

????? 其中, <Rd> 中為將寫入 C7 中的數據; <CRm>, <opcode_2> 的不同組合決定執行不同的操作:

????? ----------------------------------------------------------------------------------
????? <CRm>??????? <opcode_2>??????? 含義?????????????????????????????????? 數據
????? ----------------------------------------------------------------------------------
????? C0?????????? 4???????????????? 等待中斷激活??????????????????????????????0
????? C5?????????? 0???????????????? 使用無效整個Cache???????????????????? 0
????? C5?????????? 1???????????????? 使無效指令Cache 中的某塊?????????? 虛地址
????? C5?????????? 2???????????????? 使無效指令Cache 中的某塊?????????? 組號/組內序號
????? C5?????????? 4???????????????? 清空預取緩沖區??????????????????????????0
????? C5?????????? 6???????????????? 清空整個跳轉目標Cache??????????????? 0
????? C5?????????? 7???????????????? 清空跳轉目標Cache中的某塊??????? 生產商定義
????? C6?????????? 0???????????????? 使無效整個數據Cache??????????????????? 0
????? C6?????????? 1???????????????? 使無效數據Cache 中的某塊?????????? 虛地址
????? C6?????????? 2???????????????? 使無效數據Cache 中的某塊?????????? 組號/組內序號
??????C7?????????? 0???????????????? 使數據Cache 和指令Cache 無效??? 0
????? C7?????????? 1???????????????? 使無效整個Cache 中的某塊?????????? 虛地址
????? C7?????????? 2???????????????? 使無效整個Cache 中的某塊?????????? 組號/組內序號
????? C8?????????? 2???????????????? 等待中斷激活????????????????????????????????? 0
????? C10????????? 1???????????????? 清空數據Cache 中某塊??????????????????虛地址
????? C10????????? 2???????????????? 清空數據Cache 中某塊??????????????????組號/組內序號
??????C10????????? 4???????????????? 清空寫緩沖區?????????????????????????????????0
????? C11????????? 1???????????????? 清空整個Caceh 中某塊??????????????????虛地址
????? C11????????? 2???????????????? 清空整個Caceh 中某塊??????????????????組號/組內序號
????? C13????????? 1???????????????? 預取指令Cache 中某塊??????????????????虛地址
????? C14????????? 1???????????????? 清空并使無效數據Cache中某塊???虛地址
????? C14????????? 2???????????????? 清空并使無效數據Cache中某塊???組號/組內序號
????? C15????????? 1???????????????? 清空并使無效整個Cache中某塊???虛地址
????? C15????????? 2???????????????? 清空并使無效整個Cache中某塊???組號/組內序號
????? ----------------------------------------------------------------------------------

MCR P15, 0, <Rd>, <C8>, <CRm>, <opcode_2>

??? 其中 <Rd> 中為將寫入 C8中的數據; <CRm>, <opcode_2> 的不同組合決定指令執行不同的操作
????
????? ----------------------------------------------------------------------------------
????? 指令?????????????????????????? <opcode_2>?? <CRm>???<Rd>??? 含義
????? ----------------------------------------------------------------------------------
??????MCR P15,0,Rd,C8,C7,0? 0b0000???? 0b0111?? 0??????????? DCache,ICache 無效???
????? MCR P15,0,Rd,C8,C7,1? 0b0000???? 0b0111?? 虛地址? 整個Cache 中單個地址變換條目無效
????? MCR P15,0,Rd,C8,C5,0? 0b0000???? 0b0101?? 0??????????? 整個Cache無效
????? MCR P15,0,Rd,C8,C5,1? 0b0000???? 0b0101?? 虛地址? 指令Cache 中單個地址變換條目無效
????? MCR P15,0,Rd,C8,C6,0? 0b0000???? 0b0110?? 0??????????? 整個數據Cache無效
????? MCR P15,0,Rd,C8,C6,1? 0b0000???? 0b0110?? 虛地址? 數據Cache 中單個地址變換條目無效

那么,系統為什么要關閉mmu和cache呢?

Caches是CPU內部的一個2級緩存,它的作用是將常用的數據和指令放在CPU內部。Caches是通過CP15管理的,剛上電的時候,CPU還不能管理Caches。上電的時候指令Cache可關閉,也可不關閉,但數據Cache一定要關閉,否則可能導致剛開始的代碼里面,去取數據的時候,從Cache里面取,而這時候RAM中數據還沒有Cache過來,導致數據預取異常

bootloader階段不需要地址映射,映射了毫無意義,而且會使系統效率降低,所以需要關閉MMU.

?

七星彩走势图2元网官网