1. 程式人生 > >arm處理器快速上下文切換

arm處理器快速上下文切換

概述:
FCSE(Fast Context Switch Extension,快速上下文切換)位於CPU和MMU之間,如果兩個程序使用了同樣的虛擬地址空間,則對CPU而言,兩個程序使用了同樣的虛擬地址空間。快速上下文切換機構對各程序的虛擬地址進行變換,這樣系統中除了CPU之外的部分看到的是經過快速上下文切換機構變換的虛擬地址。快速上下文切換機構將各程序的虛擬空間變換成不同的虛擬空間,這樣在進行程序間切換時就不需要進行虛擬地址到實體地址的重對映。
快速上下文切換(FCSE)通過修改系統中不同程序的虛擬地址,避免在進行程序間切換時造成的虛擬地址到實體地址的重對映,這樣就減少了重建MMU、使cache和TLB無效、重建cache和TLB內容等操作的巨大開銷,從而提高系統的效能。

FCSE原理:
在ARM系統中,4GB的虛擬空間被分成128個程序空間塊,每個程序空間塊大小為32MB。每個程序空間塊中可以包含一個程序,該程序可以使用虛擬地址空間0x00000000~0x01ffffff,這個地址範圍也就是CPU看到的程序的虛擬空間。系統128個程序空間塊的編號為0~127,編號為I的程序空間塊中的程序實際使用的虛擬地址空間為I*0x02000000到I*0x02000000+ 0x01ffffff,這個地址空間是系統中除了CPU之外的其他部分看到的該程序所佔用的虛擬地址空間。
快速上下文切換機構將CPU發出的每個虛擬地址按照上述的規則進行變換,然後傳送到系統中的其他部分,變換過程如圖5-1所示。

地址VA到MVA的變換演算法如下:
if (VA[31:25] == 0b0000000) then
MVA = VA | (PID <<25)
else
MVA = VA

如果VA[31:25]不等於0,說明地址VA是本程序用於訪問其他程序中的資料和指令的虛擬地址,此時被訪問程序的PID不能為0。相反如果VA[31:25]等於0,說明要訪問的地址VA在該程序自身地址空間內,所以要進行程序上下文切換,將VA轉換成MVA,其中上面公式中的PID是該程序的PID號。

FCSE程式設計介面:
ARM處理器用CP15協處理器的C13暫存器來實現FCSE功能,C13暫存器的介紹詳見第4.1.2節“CP15暫存器介紹”。當要進行程序切換時,首先清空寫快取,再把新程序的頁表地址寫入CP15的C2暫存器,然後把新程序的PID號寫入CP15的C13暫存器的最高7位即可。如果處理器不支援FCSE功能,那麼使cache和TLBs無效,然後系統要重建cache和TLBs。下面我們比較一下XScale處理器以及ARMv6處理器中程序切換中的記憶體切換操作函式的區別:
XScale處理器程序切換中的記憶體切換操作函式如下所示:
.align 5
ENTRY(cpu_xscale_switch_mm)
clean_d_cache r1, r2 ;使r1所指地址到r2所指地址之間資料cache無效
mcr p15, 0, ip, c7, c5, 0 ;使系統全部指令cache無效
mcr p15, 0, ip, c7, c10, 4 ;清空寫快取Write Buffer
mcr p15, 0, r0, c2, c0, 0 ;裝入新的頁表地址
mcr p15, 0, ip, c8, c7, 0 ;使系統全部資料和指令TLBs cache無效
cpwait_ret lr, ip ;返回
ARMv6處理器程序切換中的記憶體切換操作函式如下所示:
ENTRY(cpu_v6_switch_mm)
mov r2, #0
ldr r1, [r1, #MM_CONTEXT_ID] ;獲取新程序的PID號,該PID號其實就是新程序的struct mm_struct結構中的mm_context_t成員結構context的id
mcr p15, 0, r2, c7, c10, 4 ;清空寫快取Write Buffer
mcr p15, 0, r0, c2, c0, 0 ;裝入新的頁表地址
mcr p15, 0, r1, c13, c0, 1 ;設定上下文PID號
mov pc, lr ;返回
在ARM處理器中只有ARMv6以上版本的處理器才支援FCSE功能。