0 前言
之前我們在學(xué)習MMU的時(shí)候, 知道這個(gè)內存的分配和CP15協(xié)處理器 。這里先介紹一下CP15寄存器以及訪(fǎng)問(wèn)CP15寄存器的匯編指令。
1 訪(fǎng)問(wèn)CP15寄存器的指令
訪(fǎng)問(wèn)CP15寄存器指令的編碼格式及語(yǔ)法說(shuō)明如下:
說(shuō)明:
- 協(xié)處理器行為操作碼,對于CP15來(lái)說(shuō),永遠為0b000,否則結果未知。
- 不能是r15/pc,否則,結果未知。
- 作為目標寄存器的協(xié)處理器寄存器,編號為C0~C15。
- 附加的目標寄存器或源操作數寄存器,如果不需要設置附加信息,將crm設置為c0,否則結果未知。
- 提供附加信息比如寄存器的版本號或者訪(fǎng)問(wèn)類(lèi)型 ,用于區分同一個(gè)編號的不同物理寄存器,可以省略或者將其設置為0,否則結果未知。
2 CP15寄存器介紹
CP15的寄存器列表:
ARM處理器中CP15協(xié)處理器的寄存器
CP15中寄存器C0對應兩個(gè)標識符寄存器,由訪(fǎng)問(wèn)CP15中的寄存器指令中的指定要訪(fǎng)問(wèn)哪個(gè)具體物理寄存器,與兩個(gè)標識符寄存器的對應關(guān)系如下所示:
CP15的寄存器C0
1)主標識符寄存器
訪(fǎng)問(wèn)主標識符寄存器的指令格式如下所示:
mrc p15, 0, r0, c0, c0, 0 ;將主標識符寄存器C0,0的值讀到r0中
為了防止大家不理解:
MRC:協(xié)處理器寄存器到ARM寄存器的數據傳送指令p15:ARM中用于存儲管理的系統控制協(xié)處理器CP15第一個(gè)0:操作碼1R0:ARM寄存器c0:協(xié)處理器寄存器;基本作用:ID編碼(只讀);在MMU中的作用:ID編碼和cache類(lèi)型最后一個(gè)0:操作碼2整句作用:讀取CP15的主標識寄存器的指令,該指令將主標識符寄存器的內容讀取到ARM寄存器R0中。
ARM不同版本體系處理器中主標識符寄存器的編碼格式說(shuō)明如下。
ARM7之后處理器的主標識符寄存器編碼格式如下所示:
ARM7處理器的主標識符寄存器編碼格式如下所示:
ARM7之前處理器的主標識符寄存器編碼格式如下所示:
2)cache類(lèi)型標識符寄存器
訪(fǎng)問(wèn)cache類(lèi)型標識符寄存器的指令格式如下所示:
mrc p15, 0, r0, c0, c0, 1 ;將cache類(lèi)型標識符寄存器C0,1的值讀到r0中
ARM處理器中cache類(lèi)型標識符寄存器的編碼格式如下所示:
其中控制字段位[28:25]的含義說(shuō)明如下:
cache類(lèi)型標識符寄存器的控制字段位[28:25]
控制字段位[23:12]和控制字段位[11:0]的編碼格式相同,含義如下所示:
cache容量字段bits[8: 6]的含義如下所示:
cache相聯(lián)特性字段bits[5: 3]的含義如下所示:
cache塊大小字段bits[1: 0]的含義如下所示:
CP15的寄存器C1
訪(fǎng)問(wèn)主標識符寄存器的指令格式如下所示:
mrc p15, 0, r0, c1, c0{, 0} ;將CP15的寄存器C1的值讀到r0中 mcr p15, 0, r0, c1, c0{, 0} ;將r0的值寫(xiě)到CP15的寄存器C1中
CP15中的寄存器C1的編碼格式及含義說(shuō)明如下:
CP15的寄存器C2
CP15中的寄存器C2保存的是頁(yè)表的基地址,即一級映射描述符表的基地址。其編碼格如下所示:
CP15的寄存器C3
CP15中的寄存器C3定義了ARM處理器的16個(gè)域的訪(fǎng)問(wèn)權限。
在A(yíng)RM處理器中,MMU將整個(gè)存儲空間分成最多16個(gè)域,記作D0~D15,每個(gè)域對應一定的存儲區域,該區域具有相同的訪(fǎng)問(wèn)控制屬性。每個(gè)域的訪(fǎng)問(wèn)權限分別由CP15的C3寄存器中的兩位來(lái)設定,c3寄存器的大小為32bits,剛好可以設置16個(gè)域的訪(fǎng)問(wèn)權限。
CP15的寄存器C5
CP15中的寄存器C5是失效狀態(tài)寄存器,編碼格式如下所示:
其中,域標識bit[7:4]表示存放引起存儲訪(fǎng)問(wèn)失效的存儲訪(fǎng)問(wèn)所屬的域。
狀態(tài)標識bit[3:0]表示放引起存儲訪(fǎng)問(wèn)失效的存儲訪(fǎng)問(wèn)類(lèi)型 ,該字段含義如表4-3所示(優(yōu)先級由上到下遞減)。
狀態(tài)標識字段含義
CP15中的寄存器C6
CP15中的寄存器C5是失效地址寄存器,編碼格式如下所示:
CP15中的寄存器C7
CP15的C7寄存器用來(lái)控制cache和寫(xiě)緩存,它是一個(gè)只寫(xiě)寄存器,讀操作將產(chǎn)生不可預知的后果。
訪(fǎng)問(wèn)CP15的C7寄存器的指令格式如下所示:
mcr p15, 0, < rd >, < c7 >, crm, < opcode_2 >; < rd >、< crm >和< opcode_2 >的不同取值 組合 實(shí)現不同功能
CP15中的寄存器C8
CP15的C8寄存器用來(lái)控制清除TLB的內容,是只寫(xiě)寄存器,讀操作將產(chǎn)生不可預知的后果。
訪(fǎng)問(wèn)CP15的C8寄存器的指令格式如下所示:
mcr p15, 0, < rd >, < c8 >, crm, < opcode_2 >; < rd >、< crm >和< opcode_2 >的不同取值 組合實(shí)現不同功能
CP15中的寄存器C9
CP15的C9寄存器用于控制cache內容鎖定。
訪(fǎng)問(wèn)CP15的C9寄存器的指令格式如下所示:
mcr p15, 0, < rd >, < c9 >, c0, < opcode_2 > mrc p15, 0, < rd >, < c9 >, c0, < opcode_2 >
如果系統中包含獨立的指令cache和數據cache, 那么對應于數據cache和指令cache分別有一個(gè)獨立的cache內容鎖定寄存器 ,用來(lái)選擇其中的某個(gè)寄存器:
- =1選擇指令cache的內容鎖定寄存器;
- =0選擇數據cache的內容鎖定寄存器。
CP15的C9寄存器有A、B兩種編碼格式。
編碼格式A如下所示:
其中index表示當下一次發(fā)生cache未命中時(shí),將預取的存儲塊存入cache中該塊對應的組中序號為index的cache塊中。
此時(shí)序號為0~index-1的cache塊被鎖定,當發(fā)生cache替換時(shí),從序號為index到ASSOCIATIVITY的塊中選擇被替換的塊。
編碼格式B如下所示:
CP15的寄存器C10
CP15的C10寄存器用于控制TLB內容鎖定。
訪(fǎng)問(wèn)CP15的C10寄存器的指令格式如下所示:
mcr p15, 0, < rd >, < c10 >, c0, < opcode_2 > mrc p15, 0, < rd >, < c10 >, c0, < opcode_2 >
如果系統中包含獨立的指令TLB和數據TLB,那么對應于數據TLB和指令TLB分別有一個(gè)獨立的TLB內容鎖定寄存器,
用來(lái)選擇其中的某個(gè)寄存器:
- =1選擇指令TLB的內容鎖定寄存器;
- =0選擇數據TLB的內容鎖定寄存器。
C10寄存器的編碼格式如下:
CP15的寄存器C13
C13寄存器用于快速上下文切換FCSE。
FCSE(Fast Context Switch Extension,快速上下文切換)位于 CPU 和 MMU 之間,如果兩個(gè)進(jìn)程使用了同樣的虛擬地址空間,則對 CPU而言,兩個(gè)進(jìn)程使用了同樣的虛擬地址空間。
訪(fǎng)問(wèn)CP15的C13寄存器的指令格式如下所示:
mcr p15, 0, < rd >, < c13 >, c0, 0 mrc p15, 0, < rd >, < c13 >, c0, 0
C13寄存器的編碼格式如下所示:
其中,PID表示當前進(jìn)程的所在的進(jìn)程空間塊的編號,即當前進(jìn)程的進(jìn)程標識符,取值為0~127。
- 0:MVA(變換后的虛擬地址)= VA(虛擬地址),禁止FCSE(快速上下文切換技術(shù)),系統復位后PID=0;
- 非0:使能FCSE。
3 FCSE
FCSE 概述
FCSE(Fast Context Switch Extension,快速上下文切換)位于 CPU 和 MMU 之間,如果兩個(gè)進(jìn)程使用了同樣的虛擬地址空間,則對 CPU而言,兩個(gè)進(jìn)程使用了同樣的虛擬地址空間。
快速上下文切換機構對各進(jìn)程的虛擬地址進(jìn)行變換 ,這樣系統中除了 CPU 之外的部分看到的是經(jīng)過(guò)快速上下文切換機構變換的虛擬地址。
快速上下文切換機構將各進(jìn)程的虛擬空間變換成不同的虛擬空間 , 這樣在進(jìn)行進(jìn)程間切換時(shí)就不需要進(jìn)行虛擬地址到物理地址的重映射 。
通常情況下,如果兩個(gè)進(jìn)程占用的虛擬地址空間由重疊,系統在這兩個(gè)進(jìn)程之間進(jìn)行切換時(shí),必須進(jìn)行虛擬地址到物理地址的重映射。
而虛擬地址到物理地址的重映射涉及到重建MMU中的頁(yè)表,而且cache 及TLB中的內容都必須使無(wú)效(通過(guò)設置協(xié)處理器寄存器的相關(guān)位)。
這些操作將帶類(lèi)巨大的系統開(kāi)銷(xiāo),一方面重建MMU和使無(wú)效cache及TLB的內容需要很大的開(kāi)銷(xiāo),另一方面重建cache和TLB內容也需要很大的開(kāi)銷(xiāo)。
快速上下文切換(FCSE)通過(guò)修改系統中不同進(jìn)程的虛擬地址,避免在進(jìn)行進(jìn)程間切換時(shí)造成的虛擬地址到物理地址的重映射,這樣就減少了重建 MMU,使 Cache 和 TLB無(wú)效,重建 Cache和 TLB內容等操作的巨大開(kāi)銷(xiāo),從而提高了系統的性能。
FCSE 原理
ARM系統中,4GB的虛擬空間被分成了128個(gè)進(jìn)程空間塊,每一個(gè)進(jìn)程空間塊大小為32MB。
每個(gè)進(jìn)程空間塊中可以包含一個(gè)進(jìn)程,該進(jìn)程可以使用虛擬地址空間0x0~0x01FFFFFF,這個(gè)地址范圍也就是CPU看到的進(jìn)程的虛擬空間。
系統128個(gè)進(jìn)程空間塊的編號0~127,
標號為X 的進(jìn)程空間塊中的進(jìn)程實(shí)際使用的虛擬地址空間為(X0x02000000)到(X0x02000000+0x01FFFFFF),這個(gè)地址空間是系統中除了CPU 之外的其他部分看到的該進(jìn)程所占用的虛擬地址空間。
快速上下文切換機構將CPU發(fā)出的每個(gè)虛擬地址按照上述的規則進(jìn)行變換,然后發(fā)送到系統的其他部分。變換過(guò)程如下圖:
由地址VA到MVA的變換算法如下所示;
if (VA[31:25]==0b0000000)thenMVA=VA|(PID< 25)elseMVA=VA
其中。PID為當前進(jìn)程的所在進(jìn)程空間的編號,即當前進(jìn)程的進(jìn)程標識符。其取值為0~127。
- a.系統中,每個(gè)進(jìn)程都使用虛擬地址空間0x0~0x01FFFFFF,當進(jìn)程訪(fǎng)問(wèn)本進(jìn)程的指令和數據時(shí),它產(chǎn)生的為虛擬地址VA的高7位為0;快速上下文切換機構用該進(jìn)程的進(jìn)程標示符代替VA的高7位,從而得到變換后的虛擬地址MVA,這個(gè)MVA在該進(jìn)程對應的進(jìn)程空間塊內。``` PID | PID | 0.....0 |
VA |0000000| VA | 置1運算
MVA | PID | VA |
+ b.當VA的高7位不全是0時(shí),MVA=VA。這種VA是本進(jìn)程用于訪(fǎng)問(wèn)別的進(jìn)程中的數據和指令的虛擬地址,注意這時(shí)被訪(fǎng)問(wèn)的進(jìn)程標識符不能為0.CP15中的寄存器C13用于快速上下文切換。其編碼格式如下所示。![在這里插入圖片描述](https://img-blog.csdnimg.cn/7f3d6462809345ef80c13815f7394967.png)其中,PID 表示當前進(jìn)程所在的進(jìn)程空間塊的編號,即當前進(jìn)程的進(jìn)程標識符,取值為 0~127.訪(fǎng)問(wèn)寄存器C13的指令格式如下所示。
MCR p15, 0,,,c0,0
MRC P15,0,,,c0,0
其中, 在讀操作時(shí),結果中位[31::25]返回PID,其他位的數值是不可以預知的。寫(xiě)操作將設置PID的值。
* 當PID的值為0時(shí),MVA=VA,相當于禁止了FCSE。系統復位后PID即為0.
* 當PID的值不為0時(shí),相當于使能了FCSE。
評論
查看更多