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