天天看點

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指針。

ARM的7種運作模式和37個寄存器

**不分組寄存器:**在所有的運作模式下都使用同一個實體寄存器,它們未被系統用作特殊的用途。

分組寄存器:

  1. 對于R8—R12當使用FIQ(快速中斷模式)時通路寄存器R8_fiq — R12_fiq,當使用除FIQ模式以外的其他模式時,通路寄存器

    R8 -R12

  2. 對于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)

    有兩個特殊功能,一種是每一種模式下都可以用于儲存函數的傳回位址,另外就是異常處理後的傳回位址,如中斷。

  3. PC指針(R15)

    R15用作程式計數器(PC)對應一個實體寄存器,由于ARM體系結構采用了多級流水線技術,對于ARM指令集而言,PC總是指向目前指令的下兩條指令的位址,即PC的值為目前指令的位址值加8個位元組程式狀态寄存器。

6個是狀态寄存器 1個CPSR和5個SPSR

CPSR為程式狀态寄存器,從官方文檔種可以提取到如下圖,它的各個位都表明了CPU的某些狀态資訊。

ARM的7種運作模式和37個寄存器

下面介紹其中幾個比較重要的位

ARM的7種運作模式和37個寄存器

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,以保證程式的正常運作。