1. 程式人生 > >自己學驅動17——ARM工作模式和ARM9暫存器

自己學驅動17——ARM工作模式和ARM9暫存器

1.ARM體系CPU的7種工作模式
    (1)使用者模式(usr):ARM處理器正常的程式執行狀態。
    (2)快速中斷模式(fiq):用於高速資料傳輸或通道處理。
    (3)中斷模式(irq):用於通用的中斷處理。
    (4)管理模式(svc):作業系統使用的保護模式。
    (5)資料訪問終止模式(abt):當資料或指令預取終止時進入該模式,可用於虛擬儲存及儲存保護。
    (6)系統模式(sys):執行具有特權的作業系統任務。
    (7)未定義指令中止模式(und):當未定義的指令執行時進入該模式,可用於支援硬體協處理器的軟體模擬。
    可以通過軟體進行模式的切換,或者發生各類中斷、異常時CPU自動進入相應的模式。除使用者模式以外的6種工作模式都屬於特權模式,大多數程式運行於使用者模式,進入特權模式是為了處理中斷、異常,或者訪問被保護的系統資源。

2.ARM920T的暫存器

    ARM920T有31個通用的32位暫存器和6個程式狀態暫存器,這37個暫存器分為7組,進入某個工作模式時就使用它的那組暫存器。有些暫存器,不同的工作模式下有自己的副本,當切換到另一個工作模式時,那個工作模式的暫存器副本將被使用:這些暫存器被稱為備份暫存器。從下圖中可以看出fiq模式的備份暫存器最多,這是為了提高fiq的響應速度,減少儲存暫存器值所花費的時間。

    CPSR在七種模式下都是同一個暫存器,所以可以修改裡面的值來轉換到不同的工作模式下。R0~R15可以直接訪問,除R15外均為通用暫存器,既可以用於儲存資料也可以用於儲存地址。R13~R15稍有特殊:R13又被稱為棧指標暫存器sp,通常用於儲存棧指標;R14又被稱為程式連線暫存器,當執行BL子程式呼叫指令時,R14中得到R15(程式計數器PC)的備份,而當發生中斷或異常時,對應的R14_svc、R14_irq、R14_fiq、R14_abt或R14_und儲存R15的返回值;R15又被稱為程式計數器PC。

3.CPSR暫存器

    CPSR中主要包括以下幾種狀態位:
    (1)T位:置位時,CPU處於Thumb狀態;否則處於ARM狀態。
    (2)中斷禁止位:I位和F位屬於中斷禁止位。它們被置位時,IRQ中斷、FIQ中斷分別被禁止。
    (3)工作模式位:表明CPU當前處於什麼工作模式,可以更改這些位,使CPU進入指定的工作模式。

4.SPSR暫存器
    SPSR暫存器,即程式狀態儲存暫存器,就是在除系統和使用者模式外的5種模式下來儲存CPSR暫存器的備份暫存器。當一個異常發生時,將切換進入相應的工作模式,這時ARM920T的CPU將自動完成如下事情。
    (1)在異常工作模式的連線暫存器R14中儲存前一個工作模式的下一條,即將執行的指令的地址。對於ARM狀態,這個值是當前的PC值加4或者加8。
    (2)將CPSR的值複製到異常模式的SPSR。
    (3)將CPSR的工作模式位設為這個異常對應的工作模式。
    (4)將PC值等於這個異常模式在異常向量表中的地址,即跳轉去執行異常向量表中的相應指令。
    相反地,從異常工作模式退出回到之前的工作模式時,需要通過軟體完成如下事情。
    (1)前面進入異常工作模式時,連線暫存器中儲存了前一個工作模式的一個指令地址,將它減去一個適當的值後賦給PC暫存器。
    (2)將SPSR的值複製回CPSR。

    從表中可以看出,進入和退出異常時PC的計算方法會根據不同的模式進行不同的計算,主要分為3類(在表格中的(1)(2)(3)表示該模式屬於的分類):
    (1)PC值是這些指令的地址:SWI、未定義的指令、在預取時就失敗的指令。本條指令已經被執行,下一條指令的地址就是PC+4。
    (2)PC值是這些指令的地址:進入快速中斷、中斷模式前,被打斷而未執行的指令。本條指令就已經被打斷,所以下一條指令就是PC當前指向的指令。
    (3)PC值是這些指令的地址:導致資料訪問終止的載入/儲存指令(LDR、STR、LDM和STM)。這幾個特殊指令,流水線技術會導致後面幾條的指令都是這個指令的副本,所以該條指令相當於並未執行成功,下一條指令也就是PC當前指向的指令。
    注:流水線技術導致PC的值是當前被執行指令的地址+8,然而已經被取指令的指令會繼續執行,中斷等打斷的也只是取指令,前面已經在流水線中的指令會繼續執行完畢。