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