ARM的快速上下文切換(FCSE)

一、FCSE的原理

      通常情況下,如果兩個進程佔用的虛擬地址空間由重疊,系統在這兩個進程之間進行切換時,必須進行虛擬地址到物理地址的重映射。而虛擬地址到物理地址的重映射涉及到重建MMU中的頁表,而且cache 及TLB中的內容都必須使無效(通過設置協處理器寄存器的相關位)。這些操作將帶類巨大的系統開銷,一方面重建MMU和使無效cache及TLB的內容需要很大的開銷,另一方面重建cache和TLB內容也需要很大的開銷。

      FCSE的引入避免了這種系統開銷。它位於CPU和MMU 之間。 如果兩個進程使用了同樣的虛擬地址空間,則對CPU而言,兩個進程使用了同樣的虛擬地址空間;快速上下文切換機構對各進程的虛擬地址進行變換,這樣的系統中除了CPU之外的部分看到的時經過快速上下文切換機構變換的虛擬地址。快速上下文切換機構將各進程的虛擬地址空間變換成不同的虛擬地址空間。這樣在進行進程間切換時就不需要進行虛擬地址到物理地址的重映射。

注:CPU發出的虛擬地址VA是最原始的地址,對CPU來說,不同進程間的地址都是一樣。但經過FCSE變換後,MMU看到的虛擬地址不同進程間的地址MVA是不一樣的。

      ARM系統中,4GB的虛擬空間被分成了128個進程空間塊,每一個進程空間塊大小爲32MB。每個進程空間塊中可以包含一個進程,該進程可以使用虛擬地址空間0x0~0x01FFFFFF,這個地址範圍也就是CPU看到的進程的虛擬空間。系統128個進程空間塊的編號0~127。 標號爲X的進程空間塊中的進程實際使用的虛擬地址空間爲:                                                                                     

(X *0x02000000)到(X*0x02000000+0x01FFFFFF),這個地址空間是系統中除了CPU 之外的其他部分看到的該進程所佔用的虛擬地址空間。

注:雖然虛擬空間被分成了128個進程空間塊,每個進程空間塊的大小爲32MB,但這只是針對虛擬空間而言。在經過MMU轉換以後,實際的物理空間塊的大小可能只有1M,因爲虛擬地址是被劃分成段的

 快速上下文切換機構將CPU發出的每個虛擬地址按照上述的規則進行變換,然後發送到系統的其他部分。變換過程如下圖:

由地址VA到MVA的變換算法如下所示;

if (VA[31:25]==0b0000000)then

MVA = VA  |  (PID<<25)

else

MVA=VA

其中。PID爲當前進程的所在進程空間的編號,即當前進程的進程標識符。其取值爲0~127。

        系統中,每個進程都使用虛擬地址空間0x0~0x01FFFFFF,當進程訪問本進程的指令和數據時,它產生的爲虛擬地址VA的高7位爲0;快速上下文切換機構用該進程的進程標示符代替VA的高7位,從而得到變換後的虛擬地址MVA,這個MVA在該進程對應的進程空間塊內。

        當VA的高7位不全是0時,MVA=VA。這種VA是本進程用於訪問別的進程中的數據和指令的虛擬地址,注意這時被訪問的進程標識符不能爲0.

        CP15中的寄存器C13用於快速上下文切換。其編碼格式如下所示。

訪問寄存器C13的指令格式如下所示。

MCR           p15, 0,<Rd>,<c13>,c0,0

MRC           P15, 0,<Rd>,<c13>,c0,0

其中, 在讀操作時,結果中位[31::25]返回PID,其他位 的數值是不可以預知的。寫操作將設置PID的值。

        當PID的值爲0時,MVA = VA  |  (0(PID)<<25),MVA=VA,相當於禁止了FCSE。系統復位後PID即爲0.

        當PID的值不爲0時,相當於使能了FCSE。










發佈了44 篇原創文章 · 獲贊 14 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章