ARM通用寄存器和異常處理

ARM 315瀏覽

一、ARM的編程模式和7種工作模式

1、ARM的基本設定

  • ARM 采用的是32位架構.
  • ?ARM 約定:
    • Byte :???? 8 bits
    • Halfword :16 bits (2 byte)
    • Word :?????? 32 bits (4 byte)

大部分ARM core 提供:

    • ARM 指令集(32-bit)
    • Thumb 指令集(16-bit )
    • Thumb2指令集(16 & 32bit)(集合了上邊兩個,現在大部分用的是這個)
  • Jazelle cores 支持 Java bytecode

2、ARM的處理器工作模式

分為非特權模式和特權模式:User為非特權模式,其他六種均為特權模式。

特權模式又分為兩種:一種是異常模式(中間五個),另一種是系統模式。

非特權模式:

  • User : 非特權(用戶)模式,大部分任務執行在這種模式

特權模式:

?????? 異常模式:

    • FIQ :?? 當一個高優先級(fast) 中斷產生時將會進入這種模式
    • IRQ :?? 當一個低優先級(normal) 中斷產生時將會進入這種模式
    • Supervisor :當復位或軟中斷指令執行時將會進入這種模式
    • Abort : 當存取異常時將會進入這種模式
    • Undef : 當執行未定義指令時會進入這種模式

系統模式:

  • System : 使用和User模式相同寄存器集的特權模式

注意

  • 除User(用戶模式)是Normal(普通模式)外,其他6種都是Privilege(特權模式)。
  • Privilege(特權模式)中除Sys模式外,其余5種為異常模式。
  • 各種模式的切換,可以是程序員通過代碼主動切換(通過寫CPSR寄存器);也可以是CPU在某些情況下自動切換。
  • 各種模式下權限和可以訪問的寄存器不同。

3、cpu為什么要設計這些模式

  • CPU是硬件,OS是軟件,軟件的設計要依賴硬件的特性,硬件的設計要考慮軟件需要,便于實現軟件特性。
  • 操作系統有安全級別要求,因此CPU設計多種模式是為了方便操作系統的多種角色安全等級需要。

二、ARM CPU本身自帶的37個通用寄存器

特殊功能寄存器有特定的地址用來訪問。通用型寄存器沒有特定的地址,但是有特定的名字,可以通過名字訪問。

  1. ARM總共有37個寄存器,但是每種模式下最多只能看到18個寄存器,其他寄存器雖然名字相同但是在當前模式下不可見。
  2. 對r13這個名字來說,在ARM 中共有6個名叫r13(又叫sp)的寄存器,但是在每種特定CPU模式下只有一種r13可見,其他的r13必須切換到他的對應模式下才能看到,這種設計叫影子寄存器(banked register)。

  1. sp指針表示棧指針,是程序工作區。
  2. lr用來做返回控制,用來存儲返回值(函數調用返回值)。
  3. pc表示程序控制寄存器,用來存儲程序執行在哪。

? ? ? ? ? PC(Program control register)為程序指針,PC指向哪里,CPU就會執行哪條指令(所以程序跳轉時就是把目標地址代碼放到PC中),整個CPU中只有一個PC。

? ? ? 4、cpsr是程序狀態寄存器,用來記錄當前CPU的運行狀態。

? ? ? 5、spsr是用來保存cpsr。(示例:當從USER轉換到IRQ模式時,將USER的狀態保存到IRQ的spsr中)

? ? ? 6、總結:

? ? ? ? ? ? ? ARM共有37個寄存器,都是32位長度,37個寄存器中30個為“通用”型,1個固定用作PC,一個固定用作CPSR,5個固定用作5種異常模式下的SPSR。

? ? ? 7、CPSR程序狀態寄存器

? ? ? ? ?CPSR中各個bit位表明了CPU的某些狀態信息,這些信息非常重要,和后面學到的匯編指令息息相關(譬如BLE指令中的E就和CPSR中的Z標志位有關)。

? ? ? ? ?CPSR中的I、F位和開中斷、關中斷有關。

? ? ? ? ?CPSR中的mode位(bit4~bit0共5位)決定了CPU的工作模式,在uboot代碼中會使用匯編進行設置。

? ? ? ? ?Q位和J位一般用不到。

? ? ? ? ?N、Z、C、V位表示條件位:N表示返回負,Z表示返回0,C表示進位,V表示溢出。平時均為0,發生時變為1,是程序自動置1

?

二、ARM的異常處理方式簡單介紹

  1. 什么是異常
  1. 正常工作之外的流程都叫異常
  2. 異常會打斷正在執行的工作,并且一般我們希望異常處理完成后繼續回來執行原來的工作
  3. 中斷是異常的一種
  1. ARM有五種異常模式
  1. FIQ :?? 當一個高優先級(fast) 中斷產生時將會進入這種模式
  2. IRQ :?? 當一個低優先級(normal) 中斷產生時將會進入這種模式
  3. Supervisor :當復位或軟中斷指令執行時將會進入這種模式
  4. Abort : 當存取異常時將會進入這種模式
  5. Undef : 當執行未定義指令時會進入這種模式
  1. 異常向量表
  1. 所有的CPU都有異常向量表,這是CPU設計時就設定好的,是硬件決定的。
  2. 當異常發生時,CPU會自動動作(PC跳轉到異常向量處處理異常,有時伴有一些輔助動作)
  3. 異常向量表是硬件向軟件提供的處理異常的支持。

4、ARM的異常處理機制

  • 當異常產生時, ARM core:
    • 自動拷貝 CPSR 到 SPSR_<mode>(保存當前的狀態)
    • CPU自動設置適當的 CPSR 位:
      • 改變處理器狀態進入 ARM 態(CPSR中的T位)
      • 改變處理器模式進入相應的異常模式(CPSR中的Mode位)
      • 設置中斷禁止位禁止相應中斷 (如果需要) (CPSR中的I和F位)
    • 保存返回地址到 LR_<mode>(將異常時的地址保存到異常模式下的LR中,方便返回)
    • 設置 PC 為相應的異常向量(為PC設置異常向量表中的地址)
  • 返回時, 異常處理需要:
    • 從 SPSR_<mode>恢復CPSR(恢復發生異常時的狀態)
    • 從LR_<mode>恢復PC (恢復到發生異常時程序運行處)
    • Note:這些操作只能在 ARM 態執行.

5、總結

  • 異常處理中有一些是硬件自動做的,有一些是程序員需要自己做的。需要搞清楚哪些是需要自己做的,才知道如何寫代碼。
  • 以上說的是CPU設計時提供的異常向量表,一般成為一級向量表。有些CPU為了支持多個中斷,還會提供二級中斷向量表,處理思路類似于這里說的一級中斷向量表。

?

七星彩走势图2元网官网