1. 程式人生 > >32位ARM處理器的幾種工作模式和工作狀態

32位ARM處理器的幾種工作模式和工作狀態

ARM處理器工作模式一共有 7 種 :

USR  模式
    正常使用者模式,程式正常執行模式

FIQ模式(Fast Interrupt Request)
     處理快速中斷,支援高速資料傳送或通道處理

IRQ模式
     處理普通中斷

SVC模式(Supervisor)
     作業系統保護模式,處理軟體中斷swi  reset

 

ABT  中止(Abort mode){資料、指令}
    處理儲存器故障、實現虛擬儲存器和儲存器保護

UND 未定義(Undefined)
    處理未定義的指令陷阱,支援硬體協處理器的軟體模擬

SYS 系統模式(基本上=USR)(System)
    執行特權作業系統任務

 

使用者模式和特權模式

除了使用者模式之外的其他6種處理器模式稱為特權模式

 特權模式下,程式可以訪問所有的系統資源,也可以任意地進行處理器模式的切換。

特權模式中,除系統模式外,其他5種模式又稱為異常模式。

大多數的使用者程式執行在使用者模式下,此時,應用程式不能夠訪問一些受作業系統保護的系統資源,應用程式也不能直接進行處理器模式的切換。

 使用者模式下,當需要進行處理器模式切換時,應用程式可以產生異常處理,在異常處理中進行處理器模式的切換。

 

ARM處理的工作狀態

 

在 ARM 處理器中,核心同時支援 32 位的 ARM 指令 和 16 位的 Thumb 指令。

對於 ARM 指令來說,所有的指令長度都是 32 位,並且執行週期大多為單週期,指令都是有條件執行的。

而 THUMB 指令的特點如下:

        1,指令執行條件經常不回使用。

        2,源暫存器與目標暫存器經常是相同的。

        3,使用的暫存器數量比較少。

        4,常數的值比較小。

        5,核心中的桶式移動器(barrel shifter)經常是不使用的。

也就是說 16 位的 Thumb 指令一般可以完成 和 32 位 ARM 指令相同的任務。

ARM指令和 THUMB指令的關係:

THUMB指令是ARM指令的子集
可以相互呼叫,只要遵循一定的呼叫規則
Thumb指令與ARM指令的時間效率和空間效率關係為:
        儲存空間約為ARM程式碼的60%~70%
        指令數比ARM程式碼多約30%~40%
        儲存器為32位時ARM程式碼比Thumb程式碼快約40%
        儲存器為16位時Thumb比ARM程式碼快約40~50%
        使用Thumb程式碼,儲存器的功耗會降低約30%


ARM指令和 THUMB指令之間切換(Interworking)的基本概念和切換時的子函式呼叫

 處理器模式可以通過軟體進行切換,也可以通過外部中斷或者異常處理過程進行切換。

當應用程式發生異常中斷時,處理器進入相應的異常模式。在每一種異常模式下都有一組暫存器,供相應的異常處理程式使用,這樣就可以保證在進入異常模式時,使用者模式下的暫存器不被破壞。

 系統模式並不是通過異常進入的,它和使用者模式具有完全一樣的暫存器。但是系統模式屬於特權模式,可以訪問所有的系統資源,也可以直接進行處理器模式切換。它主要供作業系統任務使用。通常作業系統的任務需要訪問所有的系統資源,同時該任務仍然使用使用者模式的暫存器組,而不是使用異常模式下相應的暫存器組,這樣可以保證當異常中斷髮生時任務狀態不被破壞。

 

Thumb指令低密度及窄儲存器時效能高的特點使得其在大多數基於 C 程式碼的系統匯中有非常廣泛的應用,但是有些場合中系統只能使用 ARM 指令,比如:

    1,如果對於速度有比較高的要求,ARM指令在寬儲存器中會提供更高的效能。

    2,某些功能只能由 ARM 指令來實現,比如:

            訪問 CPSR 暫存器來 使能/禁止 中斷或改變處理器工作模式;

            訪問協處理器CP15;

            執行 C 程式碼不支援的 DSP 算術指令;

            異常中斷(Exception)處理。在進入異常中斷後,核心自動切換到 ARM 狀態。即在異常中斷處理程式人口的一些指令是ARM指令,然後根據需要,程式可以切換到 Thumb 工作狀態,在異常中斷處理程式返回前,程式在切換到 ARM 工作狀態。

注:當處理器處於Thumb狀態時發生異常(如IRQ、FIQ、Undef、Abort、SWI等),則異常處理返回時,自動切換到Thumb狀態。

            ARM 處理器總是 從 ARM 工作狀態開始執行的。因此,如果要在偵錯程式重執行 Thumb 程式,必須為 該 Thumb 程式新增一個 ARM程式頭,然後再切換到Thumb工作狀態,呼叫該 Thumb程式。

           

 

在實際系統中,核心狀態需要經常的切換(Interworkong)來滿足系統性能要求。具體的切換是通過 Branch Exchange,即 BX 指令來實現的。指令格式為:

        Thumb 工作狀態        BX                      Rn

        ARM     工作狀態        BX     Rn

        其中Rn可以是暫存器 R0 ~ R15 中的任意一個。指令可以通過將暫存器Rn的內容,拷貝到程式計數器 PC 來完成在 4GB地址空間中的絕對跳轉,如果運算元暫存器的狀態位 Bit0 = 0,則進入 ARM 工作狀態;如果 Bit0 = 1,則進入 Thumb 工作狀態。

 

ARM暫存器一共有 37 個暫存器:

 

ARM處理器工作工作模式下的暫存器:

 

不分組暫存器R0~R7
          在所有的執行模式下,未分組暫存器都指向同一個物理暫存器,他們未被系統用作特殊的用途,因此,在中斷或異常處理進行執行模式轉換時,由於不同的處理器執行模式均使用相同的物理暫存器,可能會造成暫存器中資料的破壞,這一點在進行程式設計時應引起注意。

 

分組暫存器R8~R12
每次所訪問的物理暫存器與處理器當前的執行模式有關
R8~R12:每個暫存器對應兩個不同的物理暫存器
當使用fiq模式時,訪問暫存器R8_fiq~R12_fiq
當使用除fiq模式以外的其他模式時,訪問暫存器R8_usr~R12_usr。

 

R13、R14:每個暫存器對應6個不同的物理暫存器
其中的一個是使用者模式與系統模式共用,另外5個物理暫存器對應於其他5種不同的執行模式
採用以下的記號來區分不同的物理暫存器:
R13_
R14_
mode為以下幾種之一:usr、fiq、irq、svc、abt、und。

 

堆疊指標—R13/sp

R13在ARM指令中常用作堆疊指標,但這只是一種習慣用法,使用者也可使用其他的暫存器作為堆疊指標。
    sub    sp, sp, #4       ;reserved for PC
    stmfd    sp!, {r8-r9}

由於處理器的每種執行模式均有自己獨立的物理暫存器R13,在初始化部分,都要初始化每種模式下的R13,這樣,當程式的執行進入異常模式時,可以將需要保護的暫存器放入R13所指向的堆疊,而當程式從異常模式返回時,則從對應的堆疊中恢復。

子程式連線暫存器—R14/lr

R14也稱作子程式連線暫存器或連線暫存器LR。當執行BL子程式呼叫指令時,可以從R14中得到R15(程式計數器PC)的備份。其他情況下,R14用作通用暫存器。

在每一種執行模式下,都可用R14儲存子程式的返回地址,當用BL或BLX指令呼叫子程式時,將PC的當前值拷貝給R14,執行完子程式後,又將R14的值拷貝回PC,即可完成子程式的呼叫返回。

                BL    SUB1
                ……
    SUB1:    
                ……
                MOV PC,LR        /*完成子程式返回等    同於BX LR    */

程式計數器—R15/PC

雖然 R15 也可以用作通用暫存器,但要注意有一些特殊限制,如果違法了這些限制,指令執行的結果將是不可預料的。

 

程式狀態暫存器(CPSR/SPSR)
CPSR(當前程式狀態暫存器)
SPSR(備份的程式狀態暫存器)

所有處理器模式下都可訪問當前的程式狀態暫存器CPSR。

CPSR:程式狀態暫存器(current program status register) (當前程式狀態暫存器),在任何處理器模式下被訪問。它包含了條件標誌位、中斷禁止位、當前處理器模式標誌以及其他的一些控制和狀態位。
CPSR在使用者級程式設計時用於儲存條件碼。

   SPSR:程式狀態儲存暫存器(saved program status register),每一種處理器模式下都有一個狀態暫存器SPSR,SPSR用於儲存CPSR的狀態,以便異常返回後恢復異常發生時的工作狀態。當特定 的異常中斷髮生時,這個暫存器用於存放當前程式狀態暫存器的內容。在異常中斷退出時,可以用SPSR來恢復CPSR。由於使用者模式和系統模式不是異常中斷 模式,所以他沒有SPSR。當用戶在使用者模式或系統模式訪問SPSR,將產生不可預知的後果。

CPSR格式如下所示。SPSR和CPSR格式相同

 

 

 

程式狀態暫存器的條件碼標誌

N、Z、C、V均為條件碼標誌位。它們的內容可被算術或邏輯運算的結果所改變,並且可以決定某條指令是否被執行
在ARM狀態下,絕大多數的指令都是有條件執行的。
在Thumb狀態下,僅有分支指令是有條件執行的。

狀態暫存器的低8位(I、F、T和M[4:0])稱為控制位,發生異常時這些位可以被改變。如果處理器執行特權模式,這些位也可以由程式修改。

中斷禁止位I、F:
I=1   禁止IRQ中斷;
F=1   禁止FIQ中斷。

 T標誌位:該位反映處理器的執行狀態
ARM體系結構v5及以上的版本的T系列處理器,當該位為1時,程式運行於Thumb狀態,否則運行於ARM狀態。
ARM體系結構v5及以上的版本的非T系列處理器,當該位為1時,執行下一條指令以引起未定義的指令異常;當該位為0時,表示運行於ARM狀態。
執行模式位M[4:0]是模式位,決定處理器的執行模式

 

 

THUMB狀態下的暫存器組織

 

Thumb與ARM狀態下的暫存器關係

 

 

Linux作業系統與ARM工作模式

    首先,ARM開發板在剛上電或復位後都會首先進入SVC即管理模式,此時、程式計數器R15-PC值會被賦為0x0000 0000;bootloader就是在此模式下,位於0x0000 0000的NOR FLASH或SRAM中裝載的,因此、開機或重啟後bootloader會被首先執行。
    接著,bootloader引導Linux核心,此時、Linux核心一樣執行在ARM的SVC即管理模式下;當核心啟動完畢、準備進入使用者態init程序時,核心將ARM的當前程式狀態CPSR暫存器M[4:0]設定為10000、進而使用者態程式只能執行在ARM的使用者模式。
    由於ARM使用者模式下對資源的訪問受限,因此、可以達到保護Linux作業系統核心的目的。
    需要強調的是:Linux核心態是從ARM的SVC即管理模式下啟動的,但在某些情況下、如:硬體中斷、程式異常(被動)等情況下進入ARM的其他特權模式,這時仍然可以進入核心態(因為就是可以操作核心了);同樣,Linux使用者態是從ARM使用者模式啟動的,但當進入ARM系統模式時、仍然可以操作Linux使用者態程式(進入使用者態,如init程序的啟動過程)。
    即:Linux核心從ARM的SVC模式下啟動,但核心態不僅僅指ARM的SVC模式(還包括可以訪問核心空間的所有ARM模式);Linux使用者程式從ARM的使用者模式啟動,但使用者態不僅僅指ARM的使用者模式。

 

 

模式切換

當異常發生,CPU進入相應的異常模式時,以下工作是由CPU自動完成的:

1、在異常模式的R14中儲存前一工作模式的下一條即將執行的指令地址;

2、將CPSR的值複製到異常模式的SPSR中;

3、將CPSR的工作模式設為該異常模式對應的工作模式;

4、令PC值等於這個異常模式在異常向量表中的地址,即跳轉去執行異常向量表中的相應指令;

從異常工作模式退回到之前的工作模式時,需要由軟體來完成以下工作:

1、將異常模式的R14減去一個適當的值(4或8)後賦給PC暫存器;

2、將異常模式SPSR的值賦給CPSR;