ARM的7種執行模式和37個暫存器
ARM的7種工作模式
包括使用者模式和特權模式二大類,其中特權模式又分為系統模式和異常模式。CPU每次只能執行在一種工作模式下,各種模式之間的切換可以是程式設計師通過程式碼主動切換(通過程式狀態暫存器CPSR)也可以是CPU自己在某種情況下自動切換。在每種模式下最多隻能看到18個暫存器,其他的暫存器雖然名字相同但是在當前模式下都不可見。由於作業系統有安全級別的需要,因此CPU設計多種模式是為了滿足作業系統的多種角色安全等級的需要。
使用者模式(USR): 非特權模式,ARM處理器正常執行狀態都在這種模式。
系統模式(SYS):執行具有特權作業系統任務。
快速中斷模式(FIQ):Fast Interrupt Request,用於高速資料傳輸或通道處理。
外部中斷模式(IRQ):當普通中斷髮生時會進入。
管理模式(SVC):作業系統使用的保護模式。
資料訪問中止模式(ABT): 當資料或指令預取終止時進入,可用於虛擬儲存和儲存管理。
未定義指令終止模式(UND): 當CPU執行未定義指令時會進入。
注意:FIQ在中斷向量表中的相對地址一般為0x1C,即在該地址後沒有任何中斷向量表了,因此FIQ的中斷處理程式可以完全放在這裡;而IRQ的在中斷向量表中的相對地址為0x18,即在FIQ的前面,因此只有四個位元組,只能放一條跳轉指令,當該中斷髮生時還要從此處跳到真正的IRQ處理程式的地方執行,這也是導致IRQ比FIQ慢的原因之一。
32位的RAM共有37個暫存器
31個是通用型的,包括未分組暫存器( R0 - R7),分組暫存器(R8 - R14)和PC指標。
**不分組暫存器:**在所有的執行模式下都使用同一個物理暫存器,它們未被系統用作特殊的用途。
分組暫存器:
- 對於R8—R12當使用FIQ(快速中斷模式)時訪問暫存器R8_fiq — R12_fiq,當使用除FIQ模式以外的其他模式時,訪問暫存器
R8 -R12 - 對於R13,R14來說,每個暫存器對應6個不同的物理暫存器,其中一個是使用者模式與系統模式共用(圖中的R13,R14),另外5個物理暫存器對應其他5種不同的執行模式,並採用以下記號來區分不同的物理暫存器分別為fiq,irq,svc,abt,und.
2.1) R13在ARM指令中常用作棧指標SP
特別注意:由於每一種模式都有自己的R13,所以我們在自己初始化的時候一般都要初始化每種模式下的R13,使其指向該執行模式的棧空間。
2.2) R14稱為子程式連結暫存器LR(Link Register)
有兩個特殊功能,一種是每一種模式下都可以用於儲存函式的返回地址,另外就是異常處理後的返回地址,如中斷。 - PC指標(R15)
R15用作程式計數器(PC)對應一個物理暫存器,由於ARM體系結構採用了多級流水線技術,對於ARM指令集而言,PC總是指向當前指令的下兩條指令的地址,即PC的值為當前指令的地址值加8個位元組程式狀態暫存器。
6個是狀態暫存器 1個CPSR和5個SPSR
CPSR為程式狀態暫存器,從官方文件種可以提取到如下圖,它的各個位都表明了CPU的某些狀態資訊。
下面介紹其中幾個比較重要的位
N: 當兩個表示的有符號整數運算時,1表示運算結果為負數,0表示結果為正或零。
Z:1表示運算的結果為零,0表示運算的結果不為零。對於CMP指令,1表示進行比較的兩個數大小相等。
C:下面分四種情況討論C的設定方法:
a) 加法運算(包括比較指令CMN):當運算產生了進位時(無符號數溢位),C=1,否則C=0。
b) 減法運算(包括比較指令CMP):當運算時產生了借位(無符號數溢位),C=0,否則C=1。
c) 對於包含移位操作的非加/減運算指令,C為移出值的最後一位。
d) 對於其他的非加/減運算指令,C的值通常不改變。
V:下面分兩種情況討論V的設定方法
a) 對於加/減法運算指令,當運算元和運算結果為二進位制的補碼錶示的帶符號數時,V=1表示符號位溢位。
b) 對於其他的非加/減運算指令,C的值通常不改變。
I:1 表示禁止外部(硬體)中斷(IRQ)
F:1 表示禁止快速中斷(FIQ)
T:1表示為Thumb狀態,0為ARM狀態(Thumb態和ARM態是ARM的二種執行狀態)
M[4:0]:用來設定處理器的工作模式具體資料見本文開始的介紹。
SPSR是 除USR和SYS模式外,對應用於異常保護的CPSR的備份,異常時,儲存CPSR值,異常退出時,將該值恢復到CPSR,以保證程式的正常執行。