4.1.1 通路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,否則結果未知。
指 令 | 說 明 | 文法格式 |
mcr | 将ARM處理器的寄存器中的資料寫到CP15中的寄存器中 | mcr{<cond>} p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>} |
mrc | 将CP15中的寄存器中的資料讀到ARM處理器的寄存器中 | mcr{<cond>} p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>} |
4.1.2 CP15寄存器介紹
CP15的寄存器清單如表4-1所示。
表4-1 ARM處理器中CP15協處理器的寄存器
寄存器編号 | 基本作用 | 在MMU中的作用 | 在PU中的作用 |
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>指定要通路哪個具體實體寄存器,<opcode_2>與兩個辨別符寄存器的對應關系如下所示:
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 | |
附加 | 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 | 域辨別 | 狀态辨別 |
其中,域辨別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, <rd>, <c7>, crm, <opcode_2> ;<rd>、<crm>和<opcode_2>的不同取值組合 實作不同功能
- CP15中的寄存器C8
CP15的C8寄存器用來控制清除TLB的内容,是隻寫寄存器,讀操作将産生不可預知的後果。
通路CP15的C8寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c8>, crm, <opcode_2> ;<rd>、<crm>和<opcode_2>的不同取值組合實作不同功能,見第4.2節
- 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 |
其中index表示當下一次發生cache未命中時,将預取的存儲塊存入cache中該塊對應的組中序号為index的cache塊中。此時序号為0~index-1的cache塊被鎖定,當發生cache替換時,從序号為index到ASSOCIATIVITY的塊中選擇被替換的塊。
編碼格式B如下所示:
31 30 W W-1 0 | |
L | 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, <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 | 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, <rd>, <c13>, c0, 0
mrc p15, 0, <rd>, <c13>, c0, 0
C13寄存器的編碼格式如下所示:
31 25 24 0 |
PID |
其中,PID表示目前程序的所在的程序空間塊的編号,即目前程序的程序辨別符,取值為0~127。
0:MVA(變換後的虛拟位址)= VA(虛拟位址),禁止FCSE(快速上下文切換技術),系統複位後PID=0;
非0:使能FCSE。